避免ruby中的初始化方法

避免ruby中的初始化方法,ruby,Ruby,我正在编写下面的Ruby程序 class Animal attr_reader :name, :age def name=(value) if value == "" raise "Name can't be blank!" end @name = value end def age=(value) if value < 0 raise "An age of #{value} isn't valid!" e

我正在编写下面的Ruby程序

class Animal
  attr_reader :name, :age

  def name=(value)
    if value == ""
      raise "Name can't be blank!"
    end
    @name = value
  end

  def age=(value)
    if value < 0
      raise "An age of #{value} isn't valid!"
    end
    @age = value
  end

  def talk
    puts "#{@name} says Bark!"
  end

  def move(destination)
    puts "#{@name} runs to the #{destination}."
  end

  def report_age
    puts "#{@name} is #{@age} years old."
  end
end

class Dog < Animal
end

class Bird < Animal
end

class Cat < Animal
end

whiskers = Cat.new("Whiskers")
fido = Dog.new("Fido")
polly = Bird.new("Polly")
polly.age = 2
polly.report_age
fido.move("yard")
whiskers.talk
然后,在我的代码中应该有一个
initialize
方法,该方法将使用值“Whiskers”初始化实例变量


但是如果我这样做了,那么我使用的属性访问器的目的是什么?或者我们只能使用一个,如果我必须使用属性访问器,那么我应该避免在对象创建期间初始化实例变量。

initialize
是类的构造函数,它在创建对象时运行

属性访问器用于读取或修改现有对象的属性

参数化构造函数的优点是,可以用一种简洁的方法为对象的属性赋值

whiskers = Cat.new("Whiskers")
看起来更好,写起来也更容易

whiskers = Cat.new
whiskers.name = "Whiskers"
在本例中,
initialize
的代码如下所示

class Animal
  ...
  def initialize(a_name)
    name = a_name
  end
  ...
end

initialize
是类的构造函数,它在创建对象时运行

属性访问器用于读取或修改现有对象的属性

参数化构造函数的优点是,可以用一种简洁的方法为对象的属性赋值

whiskers = Cat.new("Whiskers")
看起来更好,写起来也更容易

whiskers = Cat.new
whiskers.name = "Whiskers"
在本例中,
initialize
的代码如下所示

class Animal
  ...
  def initialize(a_name)
    name = a_name
  end
  ...
end

所有
attr\u reader:foo
所做的就是定义方法
def foo@傅;结束
。同样地,
attr_writer:foo
def foo=(val)执行此操作@foo=val;结束
。它们不会假设您想要如何构造
initialize
方法,您必须添加如下内容

def initialize(foo)
  @foo = foo
end

不过,如果您想减少属性的样板代码,可以使用或之类的东西。

All
attr\u reader:foo
所做的是定义方法
def foo@傅;结束
。同样地,
attr_writer:foo
def foo=(val)执行此操作@foo=val;结束
。它们不会假设您想要如何构造
initialize
方法,您必须添加如下内容

def initialize(foo)
  @foo = foo
end

不过,如果您想减少属性的样板代码,可以使用或之类的方法。

您应该在类名的正下方定义一个方法,例如

def initialize name, age
@name = name
@age = age
end

您应该在类名的正下方定义一个方法,例如

def initialize name, age
@name = name
@age = age
end

请使用两个空格进行缩进并确保代码可读-@WandMaker确保我会注意。请使用两个空格进行缩进并确保代码可读-@WandMaker确保我会注意。您可能需要显示
initialize
的示例以实现此目的。您可能需要显示
initialize
的示例实现这一目标。