块参数的默认值

时间:2019-04-10 20:20:46

标签: ruby

我想创建一个方法,该方法接受一个块参数,但默认将该块设置为始终返回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是否可行。

1 个答案:

答案 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

但是方便吗?