如何定义 class 方法 :[] 使用 class_eval 时

How to define a class method :[] when using class_eval

我正在使用 quaternion gem 并想为 :[] 运算符定义一个 class 方法,该方法从数组创建一个新的四元数。我试过了

Quaternion.class_eval do
  def self.[ary]
    Quaternion.new(*ary)
  end
end

但这给出了语法错误。我该怎么做?

该方法的名称[],但它仍然以通常的方式获取其参数列表

def self.[](ary)
  ...
end

然后你称它为Quaternion[ary]

长话短说,为了能够使用 Quaternion[arg] 你想像下面这样定义它

  def self.[](arg)
    Quaternion.new(*ary)
  end

有趣的是,它为什么有效? 嗯,ruby 有

的语法糖

foo[bar]foo.[](bar)

相同

foo[bar]=baz 等同于 foo.[]=(bar, baz)

a + b实际上是a.+(b)

如果你想定义它,它看起来像这样:

def [](key)
  ...
end

def []=(key, value)
  ...
end

def +(arg)
  ...
end

因为ruby中的方法名可以有特殊字符

如果您对它在内部如何被标记化和解析感兴趣,您可以阅读 Ruby Under Microscope,这是对该主题的一个很好的介绍。我还找到了这本免费书籍,其中也涉及到该主题 -> https://ruby-hacking-guide.github.io/(查看第 8 章方法调用部分)