【问题标题】:How to get the values from outside the class ruby如何从类 ruby​​ 之外获取值
【发布时间】:2015-10-14 10:11:29
【问题描述】:

我正在尝试解决http://ruby-metaprogramming.rubylearning.com/ 中的练习 1,但我不知道如何从 A 类及其实例中获取“a”变量。

代码如下:

class A
  def initialize
    @a = 11
    @@a = 22
    a = 33
  end
  @a = 1
  @@a = 2
  a = 3
end

【问题讨论】:

  • 您无法从其范围之外访问a。它被称为“局部变量”是有原因的。

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

当你定义这个类时,输出将是局部作用域变量3

class A
  def initialize
    @a = 11
    @@a = 22
    a = 33
  end
  @a = 1
  @@a = 2
  a = 3
end        #=> 3

您可以按如下方式访问实例和类变量;

A.instance_variable_get(:@a) #=> 1
A.class_variable_get(:@@a)   #=> 2

A.new.instance_variable_get(:@a) #=> 11
A.class_variable_get(:@@a) #=> 22

对于其他值,如果您在此类上调用 initialize 并创建一个新对象,这将返回最后评估的表达式,这将是局部变量 a

if A.respond_to?(:initialize, true)
  A.new.method(:initialize).call} #=> 33
end

【讨论】:

  • 不需要method(:initialize) 业务。就send吧。
  • 另外,您的respond_to 检查有缺陷(您检查了错误的对象)并且不需要(initialize 在那里)
【解决方案2】:

我相信你说的是this exercise

我不确定如何从外部访问局部范围变量。它被称为局部作用域是有原因的。对于其他人:

类定义好后,试试:

A.instance_variable_get(:@a) # => 1
A.class_variable_get(:@@a) # => 2
A.new.instance_variable_get(:@a) # => 11
A.class_variable_get(:@@a) # => 22

编辑:我玩了一下这段代码,我想我想通了:

a = class A
  def initialize
    @a = 11
    @@a = 22
    a = 33
  end
  @a = 1
  @@a = 2
  a = 3
end

A.instance_variable_get(:@a) # => 1
A.class_variable_get(:@@a) # => 2
a # => 3
A.new.instance_variable_get(:@a) # => 11
A.class_variable_get(:@@a) # => 22
A.new.method(:initialize).call # => 33 , basically we tricked Ruby into calling initialize method again, slick huh!

编辑:@RossMc 在最后一行击败了我

【讨论】:

  • 不需要method(:initialize) 业务。就send吧。
  • 非常感谢,帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多