2016-03-02 17 views
13

Có cách nào để tạo phương thức có thể chấp nhận tham số hay không, nhưng cũng có thể được gọi mà không có tham số, trong trường hợp này tham số được coi là nil như sau?Phương pháp có tham số tùy chọn

some_func(variable) 

some_func 

Trả lời

34
def some_func(variable = nil) 
    ... 
end 
+3

Sau đó, tất nhiên, người ta phải bằng cách nào đó di fferentiate giữa nil mặc định và nil rõ ràng (nếu nó quan trọng) :) –

+3

Đó là những gì 'def some_func (variable = (variable_was_not_passed = true; nil)) Thành ngữ là dành cho. –

+0

@ JörgWMittag bạn có thể giải thích nó hoạt động như thế nào không? cảm ơn! – dowi

12

Bên cạnh những lựa chọn rõ ràng hơn các thông số với giá trị mặc định, mà Sawa đã cho thấy, sử dụng các mảng hoặc băm có thể có ích trong một số trường hợp. Cả hai giải pháp đều giữ nguyên các đối số nil.

1. Nhận như mảng:

def some_func(*args) 
    puts args.count 
end 

some_func("x", nil) 
# 2 

2. Gửi và nhận như băm:

def some_func(**args) 
    puts args.count 
end 

some_func(a: "x", b: nil) 
# 2 
+0

mục đích của việc sử dụng '* arg' và' ** arg' thay vì chỉ 'arg' là gì? –

+4

@ sagarpandya82 '* arg' thu thập đối số dưới dạng mảng. Không có '*', bạn sẽ phải gọi 'some_func ([" x ", nil])'. '** arg' thu thập tất cả các đối số được đặt tên. Không có '**', nó sẽ chỉ chấp nhận một đối số không có tên, hoặc bất kỳ số đối số nào được đặt tên. – bogl

3

Bạn cũng có thể sử dụng một hash như là đối số và có tự do hơn:

def print_arg(args = {}) 
    if args.has_key?(:age) 
    puts args[:age] 
    end 
end 

print_arg 
# => 
print_arg(age: 35, weight: 90) 
# => 35 
Các vấn đề liên quan