如何在Ruby中定义实例方法?

时间:2013-07-01 22:27:11

标签: ruby

我正在尝试定义一个名为function的方法。它在我这样做时有效:

a = A.new

def a.function
   puts 100
end

但我希望该方法适用于任何实例变量,而不仅仅是a。例如,当我在除function以外的A实例上调用a时,没有任何反应。所以我使用A::f来定义函数而不是a.function

class A
    attr_accessor :function
    attr_accessor :var
end

def A::function
    self.var = 0x123
end

a = A.new
a.function

puts a.var

这个编译很好,但是当我尝试调用该函数时,我得到一个错误。为什么它不起作用,我怎么能做我正在尝试的事情呢?

3 个答案:

答案 0 :(得分:5)

真的纠结在这里。我建议您查看_why's poignant guide to ruby并了解这里发生的事情。

虽然试图引导你,但是......

  • a不是实例变量。它是一个局部变量,用于引用A实例
  • def a.foo定义了a的本征类的方法。
  • attr_accessor :function已定义A#function(即名为A的{​​{1}}上的实例方法)基本上如下所示:function
  • def function; @function; end定义def A::function上的一个类方法,您可以通过A访问该类方法(不是A.function中的A实例。
  • MRI并不像您预期​​的那样编译红宝石。它运行它,实时动态地解释语句。

可能希望坚持以传统方式定义标准实例方法,并避免使用“function”作为占位符名称,因为它是一个保留字,在其他语言中具有特殊含义。我会在这里使用“foo”:

a.function

就是这样,您现在可以创建class A def foo 'Awww foo.' end end A)的实例并在其上调用a = A.newfoo),然后您将返回{{1 }}

答案 1 :(得分:4)

class A

  def function
    puts 100
  end

end

a = A.new
a.function #=> "100"

这是一个经典的实例方法。那是你要找的还是我错过了什么?

答案 2 :(得分:0)

如果您尝试动态定义方法,可以使用Class#define_method。否则,如果您只是想为类定义方法,那么在类A的范围内定义它就足够了。

无论如何,你能更具体地说明你想要完成什么以及你遇到了什么样的错误吗?