如何为 Ruby 中的所有实例设置默认(而不是 nil)变量初始化

yak*_*ant 1 ruby metaprogramming

实例变量在哪里第一次初始化为 nil?我可以将所有实例的默认值重新定义为其他值吗?

例如:

class Class
  #some code here or maybe in an Object class
end

class Foo1
  attr_accessor :bar
end

class Foo2
  attr_accessor :bar
end

p Foo1.new.bar # result is not nil
p Foo2.new.bar # result is not nil
Run Code Online (Sandbox Code Playgroud)

这可以通过修改阅读器来完成:

class Class
  def attr_accessor(attr_name)
    ...
    define_method "#{attr_name}" do
      if instance_variable_get "@#{attr_name}_history"
        instance_variable_get "@#{attr_name}_history"
      else
        "Not nil"
      end
    end
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

但这无助于理解 Ruby 的核心。非常感谢!

AJc*_*dez 5

如果要设置默认值,可以在initialize类的方法中分配它们。

例如:

class Test

  attr_accessor :bar

  def initialize
    @bar = 'bar'
  end

end

Test.new.bar
# => "bar"
Run Code Online (Sandbox Code Playgroud)

请记住,它attr_accessor :bar为您提供了设置和获取基础实例变量的辅助方法@bar

如果你想要很多类的默认值,你可以让它们从一个将实例变量设置为非 nil 的类继承:

class Foo < Test

end

Foo.new.bar
# => "bar"
Run Code Online (Sandbox Code Playgroud)