ruby 从类外部访问示例变量

jdgnovmf  于 2023-05-17  发布在  Ruby
关注(0)|答案(3)|浏览(186)

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

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

h = Hello.new
puts h.method1
vcirk6k6

vcirk6k61#

可以这样使用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"

如果变量是undefined(在我的例子中第一次调用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 访问器:alias :my_hello :hello
如果类不是在代码中定义的,而是在gem中定义的:您可以在代码中使用modify classesinsert new functions to classes

gab6jxml

gab6jxml2#

您也可以通过调用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

lnxxn5zx

lnxxn5zx3#

如果任何人想要访问要设置的变量,这里他们可以这样做:

puts h.instance_variable_get(:@hello) # nil
h.instance_variable_set(:@hello, "StackOverflow") # <- set the value
puts h.instance_variable_get(:@hello) # StackOverflow

相关问题