当我调用 lambda @description 时,我看不到实例变量 @model 的值。这可能吗?我只看到“很好”。当我调用 show_description 时。 提前致谢。
class Car
def initialize(model)
@model = model
end
def description
@description = lambda{yield}
end
def show_description
@description.call
end
end
c = Car.new("Ford")
c.description{"#{@model} is very good."}
puts c.show_description # => " is very good."
最佳答案
c.description{"#{@model} is very good."}
不会向您展示您想要的内容。要点是,您传递的 block 可以访问外部范围,在该范围内找不到变量 @model
,因此 @model
为 nil
。它被称为封装,因此,外界将无法直接知道/访问对象的状态,在您的情况下,该对象是c
。这里对象的状态意味着实例变量的值位于对象c
中。但是使用方法,您可以读取/更新对象的状态。
照此操作 c.description{"#{c.model} is very good."}
.
您的代码可以重写为:
class Car
attr_reader :model
def initialize(model)
@model = model
end
def description
@description = yield
end
def show_description
@description
end
end
c = Car.new("Ford")
c.description{"#{c.model} is very good."}
puts c.show_description
# >> Ford is very good.
关于ruby - 在 Ruby 中将实例变量保存在 block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971192/