🙄

[Bug #20478] 循環してデフォルト引数が参照される際のシンタックスラー関するチケット

2024/05/10に公開

[Bug #20478] Circular parameter syntax error rules

  • 以下のような『デフォルト引数のブロック内でその仮引数を参照する』ケースはシンタックスエラーになる
def foo(bar = -> { bar }) end       # no lambda parameters
def foo(bar = ->() { bar }) end     # no lambda parameters
def foo(bar = baz { bar }) end      # no block parameters
def foo(bar = baz { _1 + bar }) end # parameters, but no pipes
def foo(bar = baz { it + bar }) end # parameters, but no pipes
  • しかし、以下のようなケースだとシンタックスエラーにならないというバグ報告
def foo(bar = ->(baz) { bar }) end   # lambda parameters
def foo(bar = baz { || bar }) end    # no block parameters but empty pipes
def foo(bar = baz { |qux| bar }) end # block parameters
  • 2つ目のコードだけ見ると || の有無でエラーになったりならなかったりしますねー
  • ちなみに挙動自体は循環して参照する形になる
def foo(bar = proc { || bar })
  pp bar
  # => #<Proc:0x00007528b612eae0 /tmp/v8mZNpq/14:1>

  # これは自身を返す
  pp bar.call
  # => #<Proc:0x00007528b612eae0 /tmp/v8mZNpq/14:1>
end

foo
GitHubで編集を提案

Discussion