Значение по умолчанию для аргумента блока - PullRequest
1 голос
/ 10 апреля 2019

Я хотел бы создать метод, который принимает аргумент блока, но по умолчанию для блока используется метод, который всегда возвращает 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?Пожалуйста, не отвечайте на вопросы, основанные на внешних библиотеках (даже на Rails), просто попытайтесь выяснить, возможно ли это с чистым Ruby.

1 Ответ

1 голос
/ 11 апреля 2019

Вы можете использовать этот грязный хак:

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

Но удобно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...