在Ruby中是否有一种方法来重载初始化构造函数?
在Java中,你可以重载构造函数:在Ruby中是否有一种方法来重载初始化构造函数?
public Person(String name) {
this.name = name;
}
public Person(String firstName, String lastName) {
this(firstName + " " + lastName);
}
是否有在Ruby中的实现方式相同的结果:即采取不同的参数两个构造函数?
答案是既Yes和No.
你可以,你可以在其他语言中使用的各种机制,包括得到相同的结果: -
- 为参数的默认值
- 变量参数列表(摔跤运算符)
- 定义您的参数为散列
即使参数不同,该语言的实际语法也不允许您定义两次方法。
考虑到上述这些三个选项可以用你的例子如下实施
# As written by @Justice
class Person
def initialize(name, lastName = nil)
name = name + " " + lastName unless lastName.nil?
@name = name
end
end
class Person
def initialize(args)
name = args["name"] + " " + args["lastName"] unless args["lastName"].nil?
@name = name
end
end
class Person
def initialize(*args)
#Process args (An array)
end
end
你会遇到的第二个机制经常出现在Ruby代码,尤其是在Rails的,因为它提供了两全其美的,并允许一些语法糖来生成漂亮的代码,特别是不需要将大量的散列括在括号中。
这wikibooks link提供了更多的阅读
class Person
def initialize(name, lastName = nil)
name = name + " " + lastName unless lastName.nil?
@name = name
end
end
我倾向于做
class Person
def self.new_using_both_names(first_name, last_name)
self.new([first_name, last_name].join(" "))
end
def self.new_using_single_name(single_name)
self.new(single_name)
end
def initialize(name)
@name = name
end
end
但我不知道这是不是最好的办法。
+1:不是最好的,但肯定很聪明。遵循Ruby的命名系统。 – 2013-05-17 01:40:10
为聪明的想法+1,但这不是每个定义的重载。 – 2013-10-25 18:17:21
class StatementItem
attr_reader :category, :id, :time, :amount
def initialize(item)
case item
when Order
initialize_with_order(item)
when Transaction
initialize_with_transaction(item)
end
end
def valid?
!(@category && @id && @time && @amount).nil?
end
private
def initialize_with_order(order)
return nil if order.status != 'completed'
@category = 'order'
@id = order.id
@time = order.updated_at
@amount = order.price
end
def initialize_with_transaction(transaction)
@category = transaction.category
@id = transaction.id
@time = transaction.updated_at
@amount = transaction.amount
end
end
您可以使用konstructor创业板申报红宝石多个构造和模仿超载:
class Person
def initialize(name)
@name = name
end
konstructor
def from_two_names(first_name, last_name)
@name = first_name + ' ' + last_name
end
end
Person.new('John Doe')
Person.from_two_names('John', 'Doe')
我通常做的:
class Person
attr_reader :name
def initialize(first: nil, last: nil)
@name = [first, last].compact.join(' ')
end
end
Person.new(first: 'ya').name
# => "ya"
Person.new(first: 'ya', last: 'ku').name
# => "ya ku"
感谢您指出了'Person.new(: first_name =>“...”,:last_name =>“...”)'方法。出于某种原因,它并没有跨过我的想法来使用它,但那确实回答了我的问题。 – agentbanks217 2010-10-18 12:23:50
Ruby 2.0支持开箱即用的命名参数:http://robots.thoughtbot.com/ruby-2-keyword-arguments – 2014-11-18 03:42:37