2016-08-28 3 views
1

Пусть функция определяется следующим образом:Кристалл Как проверить, если блок задан аргумент внутри функции

def composition(text : String, k : Int32) : Array(String) 
    kmers = Array(String).new 
    (0 .. text.size - k).each do |i| 
    kmers << text[i, k] 
    yield text[i, k] 
    end 
    return kmers 
end 

Как проверить, если блок задан аргумент внутри функции? Если задан аргумент блока, то будут получены коэффициенты. Если не задано, то kmers будут возвращены как массив строк.

ответ

7

Такая проверка невозможна, потому что метод, принимающий блок (с использованием в любом месте), просто имеет другую подпись. Но это также означает, что вам не нужен чек, просто сделать 2 метода, как это:

# if you want to be explicit (makes no difference): 
# def composition(text : String, k : Int32, &block) 
def composition(text : String, k : Int32) 
    (0 .. text.size - k).each do |i| 
    yield text[i, k] 
    end 
end 

def composition(text : String, k : Int32) : Array(String) 
    kmers = [] of String 
    composition(text, k) do |s| 
    kmers << s 
    end 
    return kmers 
end 
+2

Это обрабатывает случай использования в OP, но есть еще вопрос о том, действительно ли возможно это определить, является ли или не был принят блок. Здесь? Я думаю, что нет, потому что вызов функции, ожидающей блока без блока, приводит к ошибке времени компиляции; поэтому нет возможности избежать исключения во время выполнения. –

Смежные вопросы