我想创建一个方法,该方法接受一个块参数,但默认将该块设置为始终返回true的方法。
def my_method(&print_if = Proc.new { true })
internal_value = [1, 2, 3]
puts "printing" if print_if.call(internal_value)
end
my_method { |array| array[1] == 2 }
"printing"
=> nil
my_method { |array| array[1] == 3 }
=> nil
my_method
"printing"
=> nil
似乎最好的选择是检查方法中是否存在块。这行得通,只是笨拙
def my_method(&print_if)
internal_value = [1, 2, 3]
puts "printing" if !block_given? || print_if.call(internal_value)
end
my_method { |array| array[1] == 2 }
"printing"
=> nil
my_method { |array| array[1] == 3 }
=> nil
my_method
"printing"
=> nil
有没有办法在Ruby中默认设置块arg?请不要回答依赖于外部库(甚至是Rails)的答案,只是试图找出使用纯Ruby是否可行。
答案 0 :(得分:1)
您可以使用这个肮脏的技巧:
def my_method(print_if = -> (*args) { block_given? ? yield(*args) : true })
internal_value = [1, 2, 3]
puts "printing" if print_if.call(internal_value)
end
但是方便吗?