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

Ruby私有和公共访问器

发布时间:2020-12-17 03:41:28 所属栏目:百科 来源:网络整理
导读:在 Ruby中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在紧张关系. 例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作: class Pancake attr_reader :has_sauce def initialize(toppings) sauces = [:maple,:butterscotch
在 Ruby中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在紧张关系.

例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作:

class Pancake
  attr_reader :has_sauce

  def initialize(toppings)
    sauces = [:maple,:butterscotch]
    @has_sauce = toppings.size != (toppings - sauces).size
...

但突然间我正在使用一个原始实例变量,这让我抽搐了.我的意思是,如果我需要在将来设置之前处理has_sauce,我可能需要进行更多的重构,而不仅仅是覆盖访问器.来吧,原始实例变量?布莱什.

我可以忽略这个问题并使用attr_accessor.我的意思是,任何人都可以设置属性,如果他们真的想要;毕竟,这就是Ruby.但后来我失去了数据封装的想法,对象的界面定义不太明确,系统可能更混乱.

另一种解决方案是在不同的访问修饰符下定义一对访问器:

class Pancake
  attr_reader :has_sauce
  private
    attr_writer :has_sauce
  public

  def initialize(toppings)
    sauces = [:maple,:butterscotch]
    self.has_sauce = toppings.size != (toppings - sauces).size
  end
end

这完成了工作,但对于一个简单的存取器而言,这是一大块样板,坦率地说:呃.

那么有更好的,更Ruby的方式吗?

解决方法

attr_reader等只是方法 – 没有理由你可以为自己的用途定义变体(我确实分享你的情绪)例如:

class << Object
  def private_accessor(*names)
    names.each do |name|
      attr_accessor name
      private "#{name}="
    end
  end
end

然后像使用attr_accessor一样使用private_accessor(我认为你需要一个比private_accessor更好的名字)

(编辑:李大同)

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

    推荐文章
      热点阅读