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

ruby – 我应该为实例变量使用什么约定?

发布时间:2020-12-17 01:49:17 所属栏目:百科 来源:网络整理
导读:Ruby代码中是否使用了任何实例变量约定?也就是说,我注意到,在examples部分中,实例变量使用’@’初始化,然后代码使用不带’@’的变量名: class BookInStock attr_reader: isbn attr_accessor: price def initialize (isbn,price) @isbn = isbn @price = Flo
Ruby代码中是否使用了任何实例变量约定?也就是说,我注意到,在examples部分中,实例变量使用’@’初始化,然后代码使用不带’@’的变量名:

class BookInStock
  attr_reader: isbn
  attr_accessor: price

  def initialize (isbn,price)
    @isbn = isbn
    @price = Float (price)
  end

  def price_in_cents
    Integer (price * 100 + 0.5)
  end
end

还有一些例子,代码,实例变量一直使用前缀’@’

class BookStock

  def set_price (price)
    @price = price
  end

  def get_price
    @price
  end
end

这些记录有什么区别?什么时候我应该只在对象的初始化和所有类方法中使用’@’?

解决方法

如果已为此变量定义了属性读取器(使用attr_reader或attr_accessor),则只能使用不带@的实例变量名称.这是一个轻量级助手,用于创建返回实例变量值的方法.

区别在于使用类的公共接口或访问私有数据之间的问题.例如,建议在子类或包含的模块中使用公共接口.这确保了封装.因此,您不应该从子类或模块中访问实例变量.

在类本身中,问自己这个问题:如果属性的实现发生了变化,我的使用属性是否也会发生变化?如果答案是肯定的,请直接使用实例变量;如果不是,请使用public属性.

一个例子.假设我们有一个代表一个人的Person类,并且应该包含该人的名字.首先是这个版本,只有一个简单的name属性:

class Person
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def blank?
    !@name
  end

  def to_s
    name
  end
end

注意我们如何使用实例变量作为空白?方法,但是to_s方法的public属性.这是故意的!

假设在重构步骤中我们决定Person类应单独跟踪first_name和last_name.

class Person
  def initialize(first_name,last_name)
    @first_name,@last_name = first_name,last_name
  end

  def name
    "#{@first_name} #{@last_name}"
  end

  def blank?
    !@first_name and !@last_name
  end

  def to_s
    name
  end
end

我们现在将name属性更改为常规方法,该方法根据人的名字和姓氏组成名称.我们现在可以看到可以为to_s保持相同的实现.但是,空白?需要更改,因为它依赖于底层数据.这就是为什么to_s使用了属性,但是空白的原因?使用了实例变量.

当然,区别并不总是容易的.如有疑问,请选择公共API而不是访问私有数据.

(编辑:李大同)

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

    推荐文章
      热点阅读