正如所指出的,Ruby 没有关键字参数(但它们将在 2.0 中出现)。为了实现您想要做的事情,options
哈希是一个非常常见的 Ruby 习惯用法。
def my_method(var1, options = {})
var2 = options.fetch(:var2, 1)
var3 = options.fetch(:var3, 10)
puts var1, var2, var3
end
my_method(999)
# => 999, 1, 10
my_method(999, var3: 123)
# => 999, 1, 123
my_method(999, var2: 111)
# => 999, 111, 10
my_method(999, var2: 111, var3: 123)
# => 999, 111, 123
my_method()
# => ArgumentError: wrong number of arguments (0 for 1)
请注意,使用options.fetch(:key, default)
而不是options[:key] || default
经常更可取,因为它允许您显式指定虚假值(即false
和nil
)。
options = {x: nil, y: false}
x = options[:x] || 42 # sets x to 42
x = options.fetch(:x, 42) # sets x to nil
y = options[:y] || 43 # sets y to 43
y = options.fetch(:y, 43) # sets y to false
z = options[:z] || 44 # sets z to 44
z = options.fetch(:z, 44) # sets z to 44
您甚至可以传递一个fetch
允许您推迟计算默认值的块:
options.fetch(:x) { some_expensive_calculation }
# some_expensive_calculation is only called if necessary