2008-11-28 26 views
11

Làm cách nào tôi có thể chuyển một số biến số args cho một sản lượng. Tôi không muốn vượt qua một mảng (như mã sau đây), tôi thực sự muốn vượt qua chúng như là một số lập trình của args cho khối.Làm thế nào tôi có thể lập trình chuyển args để sinh lời trong Ruby?

def each_with_attributes(attributes, &block) 
    results[:matches].each_with_index do |match, index| 
    yield self[index], attributes.collect { |attribute| (match[:attributes][attribute] || match[:attributes]["@#{attribute}"]) } 
    end 
end 

Trả lời

13

Sử dụng splat-hành * để biến mảng vào đối số.

block.call(*array) 

hoặc

yield *array 
2

Asterisk sẽ mở rộng một mảng để lập luận cá nhân trong ruby:

def test(a, b) 
    puts "#{a} + #{b} = #{a + b}" 
end 

args = [1, 2] 

test *args 
3

Sử dụng dấu hoa thị để mở rộng một mảng thành các thành phần riêng biệt của nó trong một danh sách đối số:

def print_num_args(*a) 
    puts a.size 
end 

array = [1, 2, 3] 
print_num_args(array); 
print_num_args(*array); 

Sẽ in:

1 
3 

Trong trường hợp đầu tiên mảng được truyền, trong trường hợp thứ hai, mỗi phần tử được truyền riêng. Lưu ý rằng hàm được gọi cần xử lý các đối số biến như print_num_args, nếu nó mong đợi một danh sách đối số kích thước cố định và nhận được nhiều hơn hoặc ít hơn mong đợi, bạn sẽ nhận được một ngoại lệ.

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