【问题标题】:Confusion between local variables, instance variables, and symbols局部变量、实例变量和符号之间的混淆
【发布时间】:2013-11-23 03:05:53
【问题描述】:
class​ BookInStock
  attr_reader :isbn, :price
  ​def​ initialize(isbn, price) 
    @isbn  = isbn
    @price = Float(price)
  ​end​

“这是我们在本章中第一次使用符号。正如我们所讨论的,符号只是引用名称的一种方便方式。在这段代码中,您可以将​:isbn​视为​名称​isbn​,​并将​普通​isbn​视为​变量​的​值​。在此示例中,我们将访问器方法命名为​isbn​和​price​。对应的实例变量是​@isbn​和​@price​。 ”

问题: 我知道局部变量是被赋值为实例变量的,所以当initialize方法返回时它们不会消失。但是为什么我必须在 attr_accessor 中使用符号呢?如果我只想要普通变量怎么办?我注意到在 attr_accessor 中删除 :isbn 和 :price 的冒号会导致它停止工作。

【问题讨论】:

    标签: ruby attr-accessor


    【解决方案1】:

    符号并不是真正的变量;它们更像是特殊的字符串。例如,如果您使用字符串代替,您的代码会正常工作:

    class​ BookInStock
      attr_reader 'isbn', 'price'
    
      ​def​ initialize(isbn, price) 
        @isbn  = isbn
        @price = Float(price)
      ​end
    end
    

    实际上,这更多的是惯例问题而不是功能问题。例如,惯用的 Ruby 符号通常用于命名选项。

    要详细了解符号和字符串之间的区别,请查看这篇博文:The Difference Between Ruby Symbols and Strings

    【讨论】:

      【解决方案2】:

      我重写你的代码如下:

      class BookInStock
        attr_name1 = "isbn"
        attr_name2 = :price
        attr_reader attr_name1, attr_name2
        def initialize(isbn, price) 
          @isbn  = isbn
          @price = Float(price)
        end
      end
      
      b = BookInStock.new("23456", 30.3)
      puts b.isbn
      puts b.price
      

      类定义体中的语句的执行方式与类定义体中的语句相同。 "attr_reader attr_name1, attr_name2" 不是声明,它只是一个普通的语句,它使用两个参数 attr_name1 和 attr_name 调用方法 attr_reader。 attr_reader 是 Module 中定义的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-01
        • 2016-12-27
        • 2017-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多