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 的核心。非常感谢!
如果要设置默认值,可以在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)
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |