Поведение [1, 2, 3]
является встроенным - это не ярлык для Array[1, 2, 3]
. Вы можете видеть, что это переопределяет Array[]
:
def Array.[](*args)
puts "Array[] called with arguments #{args}"
end
p [1, a: "b"] # Will print '[1, {:a=>"b"}]'
p Array[1, a: "b"] # Will print 'Array[] called with arguments [1, {:a=>"b"}]' followed by "nil"
То, как обрабатывается foo: "bar"
, является просто следствием правила, что литералы ha sh могут быть написаны без {}
при использовании в качестве последний аргумент в вызове метода или литерале массива. Он интерпретируется только как аргумент ключевого слова при вызове метода, который определен для получения аргументов ключевого слова, в противном случае он рассматривается как ha sh.