2010-12-29 23 views
10

Tôi có một phương pháp mà chấp nhận người khai thác splat:Gửi yếu tố của một mảng làm tham số cho một phương pháp gọi

def hello(foo, *bar) 
    #... do some stuff 
end 

Tôi có một mảng với chiều dài biến mà tôi muốn gửi vào phương pháp chào này :

arr1 = ['baz', 'stuff'] 
arr2 = ['ding', 'dong', 'dang'] 

tôi muốn gọi phương thức với arr1 và arr2 làm đối số cho phương pháp đó nhưng tôi cứ bị treo lên ở chỗ thanh * đang được hiểu như là một mảng thay vì tranh cãi cá nhân. Để làm mọi thứ trở nên thú vị hơn, tôi không thể thay đổi phương thức hello.

Tôi đang tìm một cái gì đó tương tự như this SO question nhưng trong ruby.

+1

Một số mã khác sẽ rất hữu ích. –

+0

Vui lòng chấp nhận câu trả lời đúng cho câu hỏi của bạn bằng cách nhấp vào bên trong dấu kiểm rỗng ở bên trái của câu trả lời hữu ích nhất. Cảm ơn! :) –

Trả lời

11

cố gắng gọi nó như thế này

hello(arr1, *arr2) 

đây là một hoạt động thông qua trong IRB

irb(main):002:0> def hello(foo, *bar) 
irb(main):003:1> puts foo.inspect 
irb(main):004:1> puts bar.inspect 
irb(main):005:1> end 
=> nil 
irb(main):006:0> arr1 = ['baz', 'stuff'] 
=> ["baz", "stuff"] 
irb(main):007:0> arr2 = ['ding', 'dong', 'dang'] 
=> ["ding", "dong", "dang"] 
irb(main):008:0> hello(arr1, arr2) 
["baz", "stuff"] 
[["ding", "dong", "dang"]] 
=> nil 
irb(main):009:0> hello(arr1, *arr2) 
["baz", "stuff"] 
["ding", "dong", "dang"] 
=> nil 

bằng cách thêm * đến các mảng thứ hai, nó đối xử với chúng như một mảng thay vì một mảng của một mảng, đó là những gì bạn đang tìm kiếm tôi nghĩ rằng

+0

cảm ơn, đó là chính xác những gì đã xảy ra. Ngay cả khi tôi gọi 'bar.class' trên các đối số được truyền vào, tôi đã thấy mảng. Tôi không nghĩ rằng nó có thể là một mảng của một mảng. – brycemcd

8

Đây là bạn:

hello('Something', *(arr1 + arr2)) 

này sẽ kết hợp arr1arr2 mảng và tập thể vượt qua họ từ đối số thứ hai vào phương pháp này.

Ví dụ:

>> def hello(str, *args) 
>> puts str 
>> args.each do |arg| 
?> puts 'Splat: ' + arg 
>> end 
>> end 
=> nil 
>> hello('Hello', *(['programming'] + ['is', 'fun'])) 
Hello 
Splat: programming 
Splat: is 
Splat: fun 
=> ["programming", "is", "fun"] 

Tham số cuối cùng của một phương pháp có thể được bắt đầu bằng dấu (*), điều này cho thấy rằng nhiều tham số có thể được truyền cho hàm. Các tham số đó được thu thập và một mảng được tạo ra.

Vì các tham số cuối cùng được thu thập thành một mảng, bạn cần sử dụng toán tử * để cho biết rằng bạn đang thực sự gửi mảng tới phương thức và không nên quấn các đối số trong mảng khác.

+0

Bất kỳ lý do nào bạn thích dán ảnh chụp màn hình thay vì mã thực tế? –

+0

@Mladen Jablanovic Không có lý do gì cả, trên thực tế nếu bạn thích tôi sẽ dán mã. –

+3

Cảm ơn. Tôi đoán nó chỉ là vấn đề thời gian khi ai đó thực sự sẽ in mã, quét các giấy in và đính kèm nó như là một hình ảnh. :) –

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