【问题标题】:How do you access a Ruby instance variable/method dynamically? [duplicate]如何动态访问 Ruby 实例变量/方法? [复制]
【发布时间】:2013-07-30 21:00:42
【问题描述】:

如何动态访问 Ruby 实例变量/方法?我基本上是在以下 PHP 代码的 Ruby 等价物之后......

$foo = new Foo;
$bar = 'bar';

echo $foo->$bar;
echo $foo->$bar();

【问题讨论】:

    标签: php ruby variables dynamic


    【解决方案1】:

    #send 方法采用方法名称。您可以在字符串上调用 #intern 以从中创建符号。所以这是等价的:

    foo = Foo.new
    bar = 'bar'
    puts foo.send(bar.intern)
    

    实例变量默认是私有的。要公开它们,正常的做法是在类定义中添加attr_reader 调用:

    class Foo
      attr_reader :bar
    
      def initialize(value_of_bar)
        @bar = value_of_bar
      end
    end
    
    bar = 'bar'
    foo = Foo.new("bar_value")
    puts foo.bar # => "bar_value"
    puts foo.send(:bar) # => "bar_value"
    puts foo.send(bar.intern) # => "bar_value"
    

    要访问并访问没有读取器方法的实例变量,#instance_variable_get 将起作用,但通常最好避免使用它。

    【讨论】:

      【解决方案2】:
      class Foo
        def initialize
          @x = 10
        end
        def test
          @x
        end
      end
      foo = Foo.new
      foo.instance_variables
      # => [:@x]
      foo.instance_variable_get(:@x)
      # => 10
      Foo.instance_methods(false)
      # => [:test]
      Foo.instance_methods(false).map{|i| foo.method(i).call}
      # => [10]
      Foo.instance_methods(false).map{|i| foo.send(i)}
      # => [10]
      

      【讨论】:

        【解决方案3】:

        instance_variable_get(别忘了@)。

        class Foo
          def initialize
            @ivar = "hello"
          end
        end
        
        foo = Foo.new
        
        foo.instance_variable_get :@ivar
        #=> "hello"
        

        或者在类上提供一个访问器

        class Bar
          attr_reader :ivar
        
          def intialize
            @ivar = "hey"
          end
        end
        
        Bar.new.ivar
        #=> "hey"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-22
          • 1970-01-01
          • 2020-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-25
          • 1970-01-01
          相关资源
          最近更新 更多