-1

我有一个像这样的课程:

class Equipment

    attr_reader :text
    attr_reader :name
    attr_reader :array1
    attr_reader :number

end

然后,我想制作 2 个构造函数,每个构造函数有 3 个参数:

1º 一 ->(文本、名称、数组 1)

2º 一 ->(文本、名称、数字)

第一个作为参数有一个数组,另一个有一个整数(1,2 ...),所以我需要定义两个构造函数,所以当我创建这个类的一个对象时,它会在数组或整数之间产生差异3º 论点。

有任何想法吗?

编辑:我想这个:

def initialize(text = "", name = "", array = array.new, number =0)

    @text = text
    @name = name
    @array1 = array
    @number = number

end

(初始化所有这些)然后:

def Equipment.newc_witharray(sometext, somename, somearray)

    @text = sometext
    @name = somename
    @array1 = somearray

end

def Equipment.newc_withint(sometext, somename, somenumber)

    @text = text
    @name = name
    @number = somenumber

end

最后像这样调用对象:

character1 = Equipment.newc_withint("Barbarian", "conan", 3)

这不应该工作吗?

4

4 回答 4

3

您可以使用所需的任何名称在类上创建任意数量的构造函数。有一个构造函数new,它继承自Object,可用于编写其他构造函数。其他答案提到构造函数,即实例方法initialize不是构造函数。也就是构造方法new默认调用的方法。

class Foo
  def self.new1 text, name, array1
    obj = new
    # do something on obj with text, name, array1
    obj
  end
  def self.new2 text, name, number
    obj = new
    # do something on obj with text, name, number
    obj
  end
end

Foo.new1(text, name, array1)
Foo.new2(text, name, number)
于 2013-10-16T20:50:00.877 回答
1

有多种方法可以实现这一目标。

哈希参数

您可以传递一个哈希并提取您感兴趣的值:

def initialize(options={})
  @text = options.fetch(:text)        # raises KeyError if :text is missing
  @name = options.fetch(:name)        # raises KeyError if :name is missing
  @array = options.fetch(:array, [])  # returns [] if :array is missing
  @number = options.fetch(:number, 0) # returns 0 if :number is missing
end

关键字参数

在 Ruby 2.0 中,您可以使用带有默认值的关键字参数:

def initialize(text: text, name: name, array: [], number: 0)
  @text = text
  @name = name
  @array = array
  @number = number
end

开启参数类型

这使得该方法更难阅读,但也可以:

def initialize(text, name, number_or_array)
  @text = text
  @name = name
  @number = 0
  @array = []
  case number_or_array
  when Integer then @number = number_or_array
  when Array then @array = number_or_array
  else
    raise TypeError, "number_or_array must be a number or an array"
  end
end
于 2013-10-16T22:13:05.263 回答
0

内置于语言中,不,Ruby 没有给你这种能力。

但是,如果您想要这种能力,我会创建一个initialize以哈希作为参数的方法。然后,您可以使用任意数量的参数创建该类的实例。

例如:

class Equipment
  attr_reader :text, :name, :array1, :number

  def initialize(options)
    [:text, :name, :array1, :number].each do |sym|
      self.send(sym) = options[sum]
    end
  end
end
于 2013-10-16T20:39:05.073 回答
0

ruby 解释器无法区分构造函数,因为直到运行时才知道类型:(

但是,您可以使用一个非常好的解决方法:

class Foobar
  def initialize(h)  # <-- h is a hash
    # pass combination of params into the hash, do what you like with them
  end
end

然后,使用此模式,您可以将任何参数组合传递给构造函数:

foobar = Foobar.new(:foo => '5', :bar => 10, :baz => 'what?')
于 2013-10-16T20:42:10.250 回答