Ruby使用相同数量的参数创建2个不同的构造函数

时间:2013-10-16 20:35:40

标签: ruby class constructor

我有一个这样的课:

class Equipment

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

end

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

1º1 - > (文字,名称,ARRAY1)

2º1 - > (文字,名称,编号)

第一个作为参数有一个数组而另一个有一个整数(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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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中,您可以将keyword arguments与默认值一起使用:

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

答案 2 :(得分:0)

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

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

E.g:

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

答案 3 :(得分: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

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

foobar = Foobar.new(:foo => '5', :bar => 10, :baz => 'what?')