From: ko1@... Date: 2016-11-04T08:33:19+00:00 Subject: [ruby-core:77907] [Ruby trunk Bug#12705] yielding args to a lambda uses block/proc rather than lambda/method semantics Issue #12705 has been updated by Koichi Sasada. This is working memo. Now I can't find out the solution. (1) auto splat for lambda with `yield ary` is allowed [Bug #9605]. So #4 is intentional change. (2) However, lambda generated by Method#to_proc is not allowed (reported by this ticket) (3) The reason of (2) is, MRI splat ary only for ISeq level proc (splat at `vm_callee_setup_block_arg()` for lambda, called by `vm_invoke_iseq_block()`), but `bmcall()` (specified by `ifunc->func`) doesn't care it. Possible solution (just now I can make) is `vm_invoke_ifunc_block()` checks it, but not clean. Fundamentally, the spec is not clean, so code should not be clean. ---------------------------------------- Bug #12705: yielding args to a lambda uses block/proc rather than lambda/method semantics https://bugs.ruby-lang.org/issues/12705#change-61222 * Author: bug hit * Status: Assigned * Priority: Normal * Assignee: Koichi Sasada * ruby -v: * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- ```ruby def yield_test yield 1, 2 yield [1, 2] end def foo(a, b) p a, b end method_lambda = method(:foo).to_proc normal_lambda = ->a, b{p a, b} yield_test(&normal_lambda) yield_test(&method_lambda) ``` the yield of [1, 2] to the method_lambda produces an argument error as you would expect but the same yield to the normal_lamda does not, the single array arg is slpatted per block/proc semantics -- https://bugs.ruby-lang.org/ Unsubscribe: