如何在Ruby中本地实现像[]这样的方法?

时间:2011-11-06 03:32:31

标签: ruby arrays methods function

因此,如果像[]和[] =这样的index_acessor方法没有硬编码到解释器中,有没有办法直接在Ruby中定义这样的方法?换句话说,如何定义方法名称,其中param位于方法名称“[*]”的一部分内

我可以发誓我曾经在Pickaxe或Ruby Way中找到过这一点,但是几小时的页面翻转让我空手而归

4 个答案:

答案 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代替defsend,而不是直接调用方法以使语法分析器了解您的代码。

以下是在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向您展示了可以做的事情。