我有一个这样的课:
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)
不应该这样吗?
答案 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?')