【问题标题】:Access instance variable from outside the class从类外部访问实例变量
【发布时间】:2012-08-20 19:19:21
【问题描述】:

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

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

h = Hello.new
puts h.method1

【问题讨论】:

    标签: ruby instance-variables


    【解决方案1】:

    是的,您可以像这样使用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 中:您可以在代码中 modify classesinsert new functions to classes

    【讨论】:

    • 您应该将此设置为访问实例变量的默认方式,因为它违反了封装性。
    • @knut 我们不能像h = Hello.newh.method1h.hello 那样做吗?
    • @nlingutla 你可以用attr_reader :hello定义一个访问器
    • 会不会是alias my_hello hello,而不是alias :my_hello :hello
    • 对我来说,这非常适合规范,您不想公开某些内容。
    【解决方案2】:

    您也可以通过调用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 将为给定变量创建一个getter 和一个setter

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

    您可能会理解,请相应地使用attr_readerattr_accessor。仅在需要 gettersetter 时使用 attr_accessor,在仅需要 getter 时使用 attr_reader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多