ruby - 在 Ruby 中将实例变量保存在 block 中

标签 ruby block instance-variables

当我调用 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,因此 @modelnil。它被称为封装,因此,外界将无法直接知道/访问对象的状态,在您的情况下,该对象是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/

相关文章:

ruby - 如何从 Ruby 中的方法返回一个 splat

ruby-on-rails - ActiveRecord::Relation 上下文中的独立 ActiveRecord 查询

java - 为什么我的静态变量在 main 方法中不可用?

java - 为字符串数组中的字符串变量赋值

Ruby - 修改类

sql - Activerecord 将具有相同列值的行合并为一个

Ruby yield 示例解释?

ruby - 多行if else ruby

ruby-on-rails - 为什么使用实例变量重定向会将您带到显示 View (登录)

ruby - 分配实例变量的快捷方式