1

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

示例代码:

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_accessors 是否需要将它们作为参数添加到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=它的用途以及为什么我不能在初始化中更改实例变量。

4

2 回答 2

1

attr_accessor :symbolattr_writer :symbol与and做同样的事情attr_reader :symbol,即它同时创建 reader ( def symbol; @symbol; end) 和 writer ( def symbol=(value); @symbol = value; end)。

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

在红宝石中,一切都是一种方法。在对象的情况下,只是where只是另一种方法object.attr = value的缩写。(类似地,运算符被定义为 Array 类上的方法,是定义在类“Class”上的方法)。object.attr=(value)attr=<<attr_accessor

于 2013-09-16T22:52:59.500 回答
0

要背诵前面所说的内容,请回想一下,如果您希望您的属性可以在您的类之外访问(您想要覆盖属性值或者您想要读取它),您将需要使用 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 (取决于情况)。

于 2013-11-21T04:19:33.510 回答