【问题标题】:Ruby: Variable initialization within classesRuby:类中的变量初始化
【发布时间】:2013-09-21 05:19:48
【问题描述】:

在初始化类中的变量(实例变量等)时遇到了一些麻烦,我想知道是否有人可以为我澄清正确的语法。

示例代码:

Class Pets
    attr_accessor :name

    def initialize(name)
        @name=name
    end

    def name=(name)
        @name = name
        #I believe this is where I change @name instance variable
    end
    #in this space I could create more <methods> for Class.new.<method>
end

我的问题是我需要attr_accessor 以及def initializedef name= 吗?

此外,如果我有多个 attr_accessor,是否需要将它们作为参数添加到 def initialize,例如:

Class Pets
    attr_accessor :name :age :color

    def initialize(name, age, color)
        @name = name
        @age = age
        @color = color

 #and if this is the case do I need methods for each (name= age= color= etc.)
end

最后一件事: 如果有人可以确认或否认我对类中 name= age=color= 类型的方法的思考过程。我认为method= 有必要更改实例变量是否正确?我有点不确定method= 的用途以及为什么我不能在初始化中更改实例变量。

【问题讨论】:

    标签: ruby class initialization instance-variables


    【解决方案1】:

    attr_accessor :symbolattr_writer :symbolattr_reader :symbol 执行相同的操作,即它同时创建读取器 (def symbol; @symbol; end) 和写入器 (def symbol=(value); @symbol = value; end)。

    Initialize 是每次创建类的新实例时调用的方法。它与new 方法不同,因为某些类可能有自己的自定义工厂方法。你不需要定义你的初始化方法,唯一的问题是symbol reader 会返回nil,因为不会设置局部变量。

    在 ruby​​ 中,一切都是方法。对于对象,object.attr = value 只是 object.attr=(value) 的缩写,其中 attr= 只是另一种方法。 (同样&lt;&lt;操作符被定义为Array类的方法,attr_accessor是类“Class”的方法)。

    【讨论】:

    • 嗯,有道理。我见过一些示例,其中代码不包含method= 值,而是类似于def method (argument) /n @instance variable 的内容,所以我对为什么需要使用method= 感到困惑。为了澄清起见,我正在做一个 rspec 教程,当我从 method= 中取出 = 时,测试没有通过。因此,我认为这总是必要的。我将如何定义多个实例变量(如代码的第二部分)?
    • 你只需要attr_accessor :attr1, :attr2, :attr 3 ...
    【解决方案2】:

    要背诵前面所说的内容,请回想一下,如果您希望您的属性可以在您的类之外访问(您想要覆盖属性值或者您想要读取它),您将需要使用 attr_accessor(或attr_writer 或 attr_reader)。

    如果我有这样的课程......

    class Calendar
      attr_reader :event_name, :all_events
    
      def initialize
        @event_name = event_name
        @all_events = [] 
      end
    
     def create_event(event_name)
       puts "#{event_name} has been added to your calendar."
       @all_events << event_name
       p @all_events
     end
    
     def see_all_events
       puts "Here are your events --"
       @all_events.each {|event| puts "- #{event}"}
     end
    
    end
    
    my_calendar=Calendar.new
    my_calendar.create_event("interview")
    my_calendar.see_all_events
    my_calendar.all_events
    

    我可以使用方法 see_all_events 或调用类 Calendar 对象上的 all_events 来读取我的所有事件。如果由于某种原因我不想要一个 see_all_events 方法,而只是希望通过在我的对象上调用 all_events 来看到它,我只能因为 attr_reader 而这样做。

    基本上,这里的重点是准确记住您希望用户如何与您的对象属性进行交互。如果它需要是私有的并且只能通过方法访问,那么你应该厌倦使用 attr_accessor 或 attr_writer 或 attr_reader (取决于情况)。

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 2011-06-21
      • 1970-01-01
      • 2017-11-30
      • 2017-10-23
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多