-1

我正在尝试定义一个名为function. 当我这样做时它有效:

a = A.new

def a.function
   puts 100
end

但我希望该方法适用于任何实例变量,而不仅仅是a. 例如,当我调用otherfunction的实例时,什么也没有发生。所以我习惯于定义函数而不是.AaA::fa.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

这编译得很好,但是当我尝试调用该函数时出现错误。为什么它不起作用,我该如何做我正在尝试的事情?

4

3 回答 3

5

你在这里真的很纠结。我建议您查看_why 的 ruby​​ 尖锐指南,了解这里发生的情况。

不过,作为试图引导你正确的尝试……</p>

  • a不是实例变量。它是一个局部变量,用于引用A.
  • def a.foo在 的特征类上定义一个方法a
  • attr_accessor :function已经定义A#function(即A调用的实例方法function)基本上如下所示:def function; @function; end
  • def A::function定义了一个A您可以通过它访问的类方法A.function(不是Aas in的实例) a.function
  • MRI 并没有像您预期的那样真正编译ruby​​。它运行它,实时动态地解释语句。

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

class A
  def foo
    'Awww foo.'
  end
end

就是这样,您现在可以创建A( a = A.new) 的实例并调用foo它 ( a.foo) ,然后您将返回'Aww foo.'

于 2013-07-01T22:40:06.683 回答
4
class A

  def function
    puts 100
  end

end

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

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

于 2013-07-01T22:33:02.450 回答
0

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

无论如何,您能否更具体地说明您要完成的工作以及您遇到的错误类型?

于 2013-07-01T22:38:57.713 回答