💬

[Bug #20064] Inconsistent behavior between array splat *nil...

2024/01/20に公開

[Bug #20064] Inconsistent behavior between array splat *nil and hash splat **nil

  • *nil**nil に一貫性がないというチケット
  • 以下のように *nil は問題ないが **nil だとエラーになる
def hoge(...)
end

# これは OK
hoge(*nil)

# これは NG
hoge(**nil)
  • これは *nilnil.to_a を呼び出しているが **nilnil.to_hash を呼び出す違うから発生している
    • NilClass#to_hash は定義されていないのでエラーになる
class X
  def to_a
    ["X#to_a"]
  end

  def to_hash
    { method: "X#to_hash" }
  end
end

# * は内部で #to_a を呼び出す
pp *X.new
# => "X#to_a"

# ** は内部で #to_hash を呼び出す
pp **X.new
# => {:method=>"X#to_hash"}
invitation = if params.key?(:inviter_id)
               { invitation_attributes: params.slice(:inviter_id) }
             end

User.create(
  email: 'john.doe@ruby.example',
  first_name: 'John',
  first_name: 'Doe',
  **invitation,
)
  • まあ、あったほうが応用は聞きそう
GitHubで編集を提案

Discussion