Skip to content

Conversation

yjukaku
Copy link
Contributor

@yjukaku yjukaku commented Aug 7, 2025

Summary

This PR fixes the event condition call to check arity even when not using methods, since the user may have defined a condition using a lambda instead of a block. ie.

state :inside do
  event :exit, transitions_to: :outside, if: ->(obj) { dont_need_args(obj) }
end

Without this PR's change, this example raises an ArgumentError if you do something like obj.exit!(123), because the lambda is being called with 2 arguments when it expects 1.

Explanation

There are two types of Procs in Ruby, lambda-based procs and non-lambda (block-like) procs. They enforce arguments differently:

Block like

irb(main):001* proc_block = Proc.new do |a,b|
irb(main):002*   puts "a: #{a}, b: #{b}"
irb(main):003> end
=> #<Proc:0x000000012d315208 (irb):1>
irb(main):005> proc_block.call(1)
a: 1, b:
=> nil
irb(main):006> proc_block.call(1,2)
a: 1, b: 2
=> nil
irb(main):007> proc_block.call(1,2, 3)
a: 1, b: 2
=> nil

Lambda/stabby arrow

irb(main):004> proc_lambda = -> (a,b) { puts "a: #{a}, b: #{b}"  }
=> #<Proc:0x000000012cd39c80 (irb):4 (lambda)>
irb(main):008> proc_lambda.call(1)
(irb):4:in 'block in <top (required)>': wrong number of arguments (given 1, expected 2) (ArgumentError)
irb(main):009> proc_lambda.call(1,2)
a: 1, b: 2
=> nil
irb(main):010> proc_lambda.call(1,2,3)
(irb):4:in 'block in <top (required)>': wrong number of arguments (given 3, expected 2) (ArgumentError)

Thus we should check arity when calling an event's condition method or block/proc/lambda.

@yjukaku
Copy link
Contributor Author

yjukaku commented Aug 7, 2025

@geekq review please :)

I also have another PR incoming for the condition kwarg issue I tagged you in yesterday

@yjukaku
Copy link
Contributor Author

yjukaku commented Oct 15, 2025

Ping

@geekq geekq merged commit 24212f4 into geekq:develop Oct 16, 2025
@geekq
Copy link
Owner

geekq commented Oct 16, 2025

Merged this PR first. The #247 will require a rebase

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants