👻

[Bug #21378] 1行メソッド定義でパターンマッチで引数を ^ で参照したときにエラーになるというバグ報告

に公開

[Bug #21378] variable pinning does not look for method arguments

  • 次のように1行メソッド定義でパターンマッチで引数を ^ で参照したときにエラーになるというバグ報告
irb(main):001> def x?(y, z) = y in { x: ^z }
<internal:kernel>:168:in 'Kernel#loop': (irb):1: syntax error found (SyntaxError)
> 1 | def x?(y, z) = y in { x: ^z }
    |                           ^ z: no such local variable

        from eval_async:132:in '<main>'
        from /bundle/gems/js-2.7.1/lib/js.rb:109:in 'Kernel.eval'
        from /bundle/gems/js-2.7.1/lib/js.rb:109:in 'block in JS.__eval_async_rb'
        from /bundle/gems/js-2.7.1/lib/js.rb:120:in 'block in JS.__async'
  • これなんですが def x?(y, z) = y in { x: ^z }(def x?(y, z) = y) in { x: ^z } のように解釈される(つまり ^z はメソッド定義の外の値を参照する)のでエラーになるみたい
  • なので次のコードではエラーにならない(が、意図する挙動にはならない)
z = 42
def x?(y, z) = y in { x: ^z }
  • これは parse.y でも同様みたいですね
GitHubで編集を提案

Discussion