90

如果一个实例变量属于一个类,我可以@hello直接使用类实例访问实例变量(例如)吗?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1
4

2 回答 2

161

是的,你可以instance_variable_get这样使用:

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
p h.instance_variable_get(:@hello) #nil
p h.method1                        #"pavan" - initialization of @hello
p h.instance_variable_get(:@hello) #"pavan"

如果变量未定义(instance_variable_get在我的示例中是第一次调用),您将得到nil.


正如安德鲁在他的评论中提到的:

您不应将此作为访问实例变量的默认方式,因为它违反了封装。

更好的方法是定义一个访问器:

class Hello
  def method1
    @hello = "pavan"
  end
  attr_reader :hello  
end

h = Hello.new
p h.hello #nil
p h.method1                        #"pavan" - initialization of @hello
p h.hello #"pavan"

如果你想要另一个方法名,你可以给访问器取别名alias :my_hello :hello

如果该类未在您的代码中定义,而是在 gem 中:您可以修改代码中的类并将新函数插入到 classes

于 2012-08-25T14:19:42.387 回答
24

您也可以通过调用attr_readerattr_accessor这样来完成此操作:

class Hello
  attr_reader :hello

  def initialize
    @hello = "pavan"
  end
end

或者

class Hello
  attr_accessor :hello

  def initialize
    @hello = "pavan"
  end
end

调用将为给定变量attr_reader创建一个:getter

h = Hello.new
p h.hello        #"pavan"

调用将为给定变量attr_accessor创建一个getterAND a :setter

h = Hello.new
p h.hello        #"pavan"
h.hello = "John"
p h.hello        #"John"

正如您可能理解的那样,使用attr_readerattr_accessor相应地使用。仅attr_accessor在需要getterAND a时setter使用attr_reader,仅在需要 a 时使用getter

于 2016-07-23T17:46:50.430 回答