2016-08-08 4 views
0

Какова цель выхода в Ruby? Может ли кто-нибудь объяснить это? Я не понимаю, что выход делает:Какова доходность?

def variable(&block) 
    puts 'Here goes:' 
    case block.arity 
     when 0 
      yield 
     when 1 
      yield 'one' 
     when 2 
      yield 'one', 'two' 
     when 3 
      yield 'one', 'two', 'three' 
    end 
    puts 'Done!' 
end 
+5

Вы попробовали прочитать документацию? –

ответ

1

Если метод вызывается с блоком, то этот метод может yield управление блоком (назовем блок) с некоторыми аргументами, если это необходимо.

1

Любой метод можно вызывать с блоком как неявный аргумент. Внутри метода вы можете вызвать блок, используя ключевое слово yield со значением. Затем метод может вызывать связанный блок один или несколько раз с использованием инструкции yield Ruby. Таким образом, любой метод, который хочет взять блок в качестве параметра можно использовать ключевое слово выход для выполнения блока в любое время:

=begin 
    Ruby Code blocks are chunks of code between braces or 
    between do..end that you can associate with method invocations 
=end 
def call_block 
    puts 'Start of method' 
    # you can call the block using the yield keyword 
    yield 
    yield 
    puts 'End of method' 
end 
# Code blocks may appear only in the source adjacent to a method call 
call_block {puts 'In the block'} 

Выход есть:

>ruby p022codeblock.rb 
    Start of method 
    In the block 
    In the block 
    End of method 
    >Exit code: 0 

Если вы предоставляете блок кода когда вы вызываете метод, затем внутри метода вы можете yield управлять этим блоком кода - приостановить выполнение метода; выполнить код в блоке; и вернуть управление в тело метода сразу после вызова. Если код кода не передан и вызывается yield, Ruby вызывает исключение.

2

Вы можете использовать выход для неявного вызова блока. Вы определяете, где вызывать блок, если есть данный блок. Например:

def test 
    puts "You are in the method" 
    yield 
    puts "You are again back to the method" 
    yield 
end 
test {puts "You are in the block"} 

Это будет результаты в

You are in the method 
You are in the block 
You are again back to the method 
You are in the block 

Надеется, что это помогает!

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