2015-01-27 2 views
1

Как я могу убедиться, что метод выполняется один раз. Если метод A вставлен внутри метода Ai в качестве блока для вторичных методов, не выполняется. Что-то вроде этого:Выполнение того же кодового блока (выход)

def a 
    puts "|start|" 
    yield 
    puts "|end|" 
end 

a do 
    a { "|test_one|" } 
    a { "|test_two|" } 
end 

=> "|start||test_one||test_two||end|" 

Не нравится:

=> "|start|test_one|start|end|test_two|end|" 
+1

Ваш пример не может работать, 'a '| test_one |" 'будет возвращать недопустимое количество аргументов, потому что вам нужно предоставить блок методу' a' – Grych

+0

@Grych Я скорректировал пример –

+2

Еще не очень хороший пример. Блок '' | test one | "' просто возвращает строку, ничего не пишет в консоли. Пожалуйста, объясните, что вы хотите заархивировать. – Grych

ответ

1

В текущем примере вы вызова вашей функции a рекурсивно дважды.

Если вы изменить свой код, как следовать он будет выполнять блок только один раз и получить результат, который вы описываете:

def a 
    puts "|start|" 
    yield 
    puts "|end|" 
end 

a do 
    puts "|test_one|" 
    puts "|test_two|" 
end 
+0

Это был простой пример. В реальном мире это более сложный дизайн. И мне нужно использовать это: a do a {"| test_one |"} a {"| test_two |"} конец И не знаю, как изменить метод: def a puts "| start |" if # Здесь некоторое условие yield puts "| end |" if # Здесь некоторое условие end –

0

В вашем примере метод a будет выполняться три раза, потому что вы выполняете его один раз в основную часть и два раза в блоке. Чтобы получить желаемый результат, вам не нужно запускать этот метод в блоке. Просто запустите блок, который содержит две команды:

irb(main):066:0> a do 
irb(main):067:1* puts "|test_one|" 
irb(main):068:1> puts "|test_two|" 
irb(main):069:1> end 
|start| 
|test_one| 
|test_two| 
|end| 
0

Вы призывающий метод a, но не печать блока, который был уступили.

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

поэтому ваш метод на самом деле становится таким, когда рубин интерпретирует код.

puts "|start|" 
    puts "|start|" # 
    "|test_one|" # replaced for yield on call `a {"|test_one|"}` 
    puts "|end|" # 
    puts "|start|" # 
    "|test_two|" # replaced for yield on call `a {"|test_two|"}` 
    puts "|end|" # 
    puts "|end|" 

Выход:

|start||start||end||start||end||end| 

Если вы хотите, чтобы убедиться, что блок возвращается затем добавить puts перед тем yield

def a 
    puts "|start|" 
    puts yield 
    puts "|end|" 
end 

Затем вызовите ваш метод так же, как и теперь выход будет.

|start||start||test_one||end||start||test_two||end||end| 

Исправьте меня, если мне что-то не хватает.

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