我正在尝试定义一个名为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
这个编译很好,但是当我尝试调用该函数时,我得到一个错误。为什么它不起作用,我怎么能做我正在尝试的事情呢?
答案 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
实例。你可能希望坚持以传统方式定义标准实例方法,并避免使用“function”作为占位符名称,因为它是一个保留字,在其他语言中具有特殊含义。我会在这里使用“foo”:
a.function
就是这样,您现在可以创建class A
def foo
'Awww foo.'
end
end
(A
)的实例并在其上调用a = A.new
(foo
),然后您将返回{{1 }}
答案 1 :(得分:4)
class A
def function
puts 100
end
end
a = A.new
a.function #=> "100"
这是一个经典的实例方法。那是你要找的还是我错过了什么?
答案 2 :(得分:0)
如果您尝试动态定义方法,可以使用Class#define_method。否则,如果您只是想为类定义方法,那么在类A的范围内定义它就足够了。
无论如何,你能更具体地说明你想要完成什么以及你遇到了什么样的错误吗?