2013-08-01 27 views
10

Tôi vừa xem qua các Camping codebase khi tôi nhìn thấy một constructor với nền được sử dụng như thế này:Toán tử Splat làm gì khi không có tên biến?

class Fruit 
    def initialize(*) 
    end 
end 

Tôi đã cố gắng nhìn lên "splat không có tên biến" trên trang web này và Google, nhưng tôi couldn' t tìm thấy bất cứ điều gì ngoài thông tin về splat đang được sử dụng với một tên biến như thế này *some_var, nhưng không phải không có nó. Tôi cố gắng chơi xung quanh với điều này trên một repl, và tôi đã cố gắng những thứ như:

class Fruit 
    def initialize(*) 
     puts * 
    end 
end 

Fruit.new('boo') 

nhưng chạy vào lỗi này:

(eval):363: (eval):363: compile error (SyntaxError) 
(eval):360: syntax error, unexpected kEND 
(eval):363: syntax error, unexpected $end, expecting kEND 

Nếu câu hỏi này chưa được hỏi đã có, ai đó có thể giải thích cú pháp này làm gì?

Trả lời

8

Thông thường một biểu tượng như thế này được sử dụng để xác định các đối số không được phương thức sử dụng nhưng được sử dụng bởi phương thức tương ứng trong một siêu lớp. Dưới đây là ví dụ:

class Child < Parent 
    def do_something(*) 
    # Do something 
    super 
    end 
end 

Điều này nói, gọi phương thức này trong lớp siêu, chuyển tất cả các tham số đã được đưa cho phương pháp gốc.

nguồn: Lập trình ruby ​​1.9 (Dave Thomas)

+0

Đây chỉ là một trường hợp đặc biệt của những gì Josnidhin đề cập. – sawa

4

Nó hoạt động tương tự như args * nhưng bạn không thể tham khảo sau đó trong phương pháp cơ thể

def print_test(a, *) 
    puts "#{a}" 
end 

print_test(1, 2, 3, 'test') 

này sẽ in 1.

Các vấn đề liên quan