如何定义 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 章方法调用部分)
我正在使用 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 章方法调用部分)