Как объявить аргумент блока с одним или двумя аргументами в кристалле - PullRequest
1 голос
/ 14 марта 2020

Я хочу иметь возможность принять аргумент блока, который принимает один или два аргумента Int

Этот код не работает, но выражает мои намерения.
def initialize(*input, &block : (Int32 | (Int32, Int32)) -> Int32) @input = input @calc = block end

Это работает для блока с одним аргументом Int. Как мне заставить его работать с одним или двумя аргументами Int?

1 Ответ

2 голосов
/ 15 марта 2020

Взятие параметра блока необязательно в Crystal. Так что просто объявите блок с максимальным количеством аргументов и определите на стороне вызова, сколько из них вы собираетесь взять:

def foo(&block : (Int32, Int32) -> Int32)
  block.call(1, 2)
end

foo {|a, b| a + b } # => 3
foo {|a| a } # => 1
foo { 5 } # => 5
...