因此,如果像[]和[] =这样的index_acessor方法没有硬编码到解释器中,有没有办法直接在Ruby中定义这样的方法?换句话说,如何定义方法名称,其中param位于方法名称“[*]”的一部分内
我可以发誓我曾经在Pickaxe或Ruby Way中找到过这一点,但是几小时的页面翻转让我空手而归
答案 0 :(得分:5)
class Foo
def []=(k, v)
end
def [](k)
end
end
<强> EDIT1:强>
尽管定义可能看起来不像,但上面定义的方法可以这样调用:
f = Foo.new
f[1] = 2
f[3]
答案 1 :(得分:2)
不幸的是,没有办法用有趣的名字定义你自己的方法,你只能重新定义那些名字被硬编码到Ruby中的方法。
答案 2 :(得分:0)
这是Ruby语法分析器的限制。通常你只能调用像object.method(arg)
这样的方法,但是方括号是一个特殊情况(以及其他几个)。解析器将object[something]
解释为object.[](something)
,即使用参数[]
在object
上调用方法something
。
您可以拥有自己喜欢的任何方法名称,但是对于花哨的方法名称,您必须使用define_method
代替def
和send
,而不是直接调用方法以使语法分析器了解您的代码。
以下是在Greeter上定义和调用方法<>
的示例。
class Greeter
define_method "<>" do |name|
puts "Hello, #{name}"
end
end
Greeter.new.send("<>", "Semyon")
答案 3 :(得分:0)
如果你想为Ruby引入新的语法,我认为在YARV的源代码中编辑parse.y是可行的方法。 Rubykaigi 2011上有一个名为parse.y famtour的演讲,通过编辑parse.y向您展示了可以做的事情。