Ruby 别名带额外参数(索引和值)的括号设置器

Ruby 别名带额外参数(索引和值)的括号设置器,ruby,alias,brackets,Ruby,Alias,Brackets,我试图在Ruby中为setter方法添加一个额外的参数。我似乎已经设法做到了这一点,但我无法从别名中调用原始方法 # Original method def []=(variable_id, value) @data[variable_id] = value on_change end # My alias class Game_Variables alias :foo :[]= def []=(variable_id, value) old_value = @data

我试图在Ruby中为setter方法添加一个额外的参数。我似乎已经设法做到了这一点,但我无法从别名中调用原始方法

# Original method
def []=(variable_id, value)
  @data[variable_id] = value
  on_change
end

# My alias
class Game_Variables
  alias :foo :[]=
  def []=(variable_id, value)
    old_value = @data[variable_id]
    foo[variable_id] = value # wrong number of arguments 0 for 2.
    on_set_variable(variable_id, old_value, @data[variable_id])
  end
end

似乎在调用原始方法时不应该使用括号。。。不是很直观,但也许我错过了什么

# My alias
class Game_Variables
  alias :foo :[]=
  def []=(variable_id, value)
    old_value = @data[variable_id]
    foo(variable_id, value)
    on_set_variable(variable_idx, old_value, @data[variable_id])
  end
end
鉴于这一类

class GameVariables
  def []=(key, value)
    # do something
  end
end

vars = GameVariables.new
您可以用不同的等效方式调用setter。最常见和最惯用的是

vars[:abc] = 123
然而,这实际上是使用Ruby中内置的语法糖。事实上,此调用实际上解决了以下问题:

vars.[]=(:abc, 123)
foo()[variable_id] = value
这适用于所有操作符,如
+
-
==
和其他类型的数组/哈希访问器。在Ruby中,运算符的整个概念只是语法糖,它使Ruby解析器自动将某些调用构造(如哈希设置器)解析为它们的实际方法调用。但是,这只适用于某些特定命名的方法名,其中一个是
[]=

当您想使用另一个名称使用原始
[]=
方法的功能时,您不能再依赖解析器来解析语法糖了。因此,你的电话

foo[variable_id] = value
实际上,我决心:

vars.[]=(:abc, 123)
foo()[variable_id] = value
这显然只传递给方法几个参数。要真正能够正确调用foo方法,可以使用以下方法:

foo(variable_id, value)

这使用了普通的老方法调用语法,而不需要解析器应用任何语法糖。

谢谢,这很好地解释了这一点。现在我理解了0参数错误。