В Ruby отсутствует передача аргументов по ключевым словам. (Пока нет, во всяком случае, это одна из вещей, которая может превратить его в Ruby 2.0. Однако, нет никаких гарантий, и работа над Ruby 2.0 еще даже не началась , так что неизвестно, когда или даже если мы увидим ключевые аргументы в Ruby.)
Что действительно происходит , так это то, что вы передаете выражение arg2 = 4
в качестве единственного аргумента в списке аргументов. Ruby - это строгий язык с передачей по значению, что означает, что все аргументы полностью оцениваются перед их передачей в метод. В этом случае arg2 = 4
является выражением присваивания (в Ruby все является выражением (т. Е. Все возвращает значение), операторов нет). Вы присваиваете непосредственный литерал Fixnum
значение 4
локальной переменной arg2
. Выражения присваивания всегда возвращают значение их правой части, в данном случае 4
.
Итак, вы передаете значение 4
как единственный аргумент в ваш метод, что означает, что он привязывается к первому обязательному параметру, если он есть (в данном случае его нет), в противном случае к первый необязательный параметр (в данном случае arg1
).
Обычный способ справиться с подобными ситуациями - вместо этого использовать Hash
, например:
some_method({:arg2 => 4})
Поскольку этот шаблон используется так часто, существует особая синтаксическая поддержка: если аргумент last для метода равен Hash
, вы можете оставить фигурные скобки:
some_method(:arg2 => 4)
В Ruby 1.9 есть еще одна синтаксическая удобная форма: поскольку Hash
часто используются с Symbol
ключами, для этого существует альтернативный буквенный синтаксис Hash
:
some_method({arg2: 4})
Объедините их обоих, и у вас почти будут ключевые аргументы:
some_method(arg2: 4)
(На самом деле оба эти ярлыка были специально добавлены, чтобы обеспечить легкий путь перехода к возможным будущим версиям Ruby с аргументами ключевых слов.)
MacRuby фактически поддерживает многочастные селекторы сообщений в стиле Smalltalk для взаимодействия с Objective-C. Обратите внимание, однако, что селекторы многочастных сообщений в стиле Smalltalk являются , а не аргументами ключевых слов, они ведут себя совершенно по-разному. Также, конечно, это расширение относится только к MacRuby и не входит в спецификацию Ruby и не переносимо на MRI, YARV, JRuby, XRuby, IronRuby, MagLev, Rubinius, tinyrb, RubyGoLightly, BlueRuby, SmallRuby или любую другую реализацию Ruby.