2010-10-18 63 views

回答

63

答案是既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提供了更多的阅读

+0

感谢您指出了'Person.new(: first_name =>“...”,:last_name =>“...”)'方法。出于某种原因,它并没有跨过我的想法来使用它,但那确实回答了我的问题。 – agentbanks217 2010-10-18 12:23:50

+4

Ruby 2.0支持开箱即用的命名参数:http://robots.thoughtbot.com/ruby-2-keyword-arguments – 2014-11-18 03:42:37

4
class Person 
    def initialize(name, lastName = nil) 
    name = name + " " + lastName unless lastName.nil? 
    @name = name 
    end 
end 
19

我倾向于做

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 

但我不知道这是不是最好的办法。

+0

+1:不是最好的,但肯定很聪明。遵循Ruby的命名系统。 – 2013-05-17 01:40:10

+0

为聪明的想法+1,但这不是每个定义的重载。 – 2013-10-25 18:17:21

2
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 
0

您可以使用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') 
0

我通常做的:

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" 
相关问题