加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 从块设置实例变量

发布时间:2020-12-17 03:44:06 所属栏目:百科 来源:网络整理
导读:我如何实现类似下面的内容,以便当我在块中设置s变量时,它还在我的Topic类中设置@subject实例变量? class Topic def subject(blk) blk.call(@subject) if block_given? @subject unless block_given? endendmy_topic = Topic.newp my_topic.subject #= nilmy
我如何实现类似下面的内容,以便当我在块中设置s变量时,它还在我的Topic类中设置@subject实例变量?

class Topic
  def subject(&blk)
    blk.call(@subject) if block_given?
    @subject unless block_given?
  end
end

my_topic = Topic.new

p my_topic.subject #=> nil

my_topic.subject do |s|
  s = ['one','two','three']
  s.pop
  p s #=> ['one','two']
end

p my_topic.subject #=> nil... want it to be ['one,'two']

解决方法

你不能按照你想要的方式去做. block参数引用与实例变量相同的对象,但它们是完全不同的变量,设置一个永远不会设置另一个.有两种选择:

>将变量设置为块的结果,因此它将如下所示:

class Topic
  def subject
    @subject = yield if block_given?
    @subject unless block_given?
  end
end

在块内:

my_topic.subject do
  s = ['one','two']
  s
end

>使主题方法instance_eval成为块,以便块可以显式设置实例变量

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读