2010-10-18 19 views

Trả lời

63

Câu trả lời là cả hai Yes và No.

Bạn có thể đạt được kết quả tương tự như bạn có thể bằng các ngôn ngữ khác sử dụng một loạt các cơ chế bao gồm: -

  • Giá trị mặc định cho các đối số
  • Danh sách đối số biến (toán tử ký tự)
  • Xác định đối số của bạn dưới dạng băm

Cú pháp thực tế của ngôn ngữ không cho phép bạn xác định phương thức hai lần, ngay cả khi các đối số khác nhau.

Xét ba tùy chọn ở trên này có thể được thực hiện với ví dụ của bạn như sau

# 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 

Bạn sẽ gặp phải các cơ chế thứ hai thường xuyên trong mã Ruby, đặc biệt là trong Rails vì nó cung cấp tốt nhất của cả hai thế giới và cho phép một số đường cú pháp để tạo ra mã khá, đặc biệt không phải kèm theo băm được truyền trong dấu ngoặc đơn.

này wikibooks link cung cấp một số đọc hơn

+0

Cảm ơn vì đã chỉ ra 'cái Person.new (: phương thức first_name => "...",: last_name => "...") '. Vì một lý do nào đó nó không vượt qua tâm trí của tôi để sử dụng nó, nhưng điều đó không trả lời câu hỏi của tôi. – agentbanks217

+4

Ruby 2.0 hỗ trợ các tham số có tên trong hộp: http://robots.thoughtbot.com/ruby-2-keyword-arguments –

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

tôi có xu hướng để làm

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 

Nhưng tôi không biết nếu điều này là cách tiếp cận tốt nhất.

+0

+1: Không phải là tốt nhất, nhưng chắc chắn thông minh. Theo dõi hệ thống đặt tên của Ruby. –

+0

+1 cho ý tưởng thông minh, mặc dù đây không phải là quá tải cho mỗi định nghĩa. –

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

Bạn có thể sử dụng konstructor đá quý để khai báo nhiều nhà xây dựng trong Ruby và bắt chước quá tải:

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

tôi thường làm:

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" 
Các vấn đề liên quan