2010-06-04 5 views
2

У меня есть две функции с тем же условием, и мне интересно, что это лучший способ написать это? Я знаю, что один способ сделать это - использовать if (condition) ... end, но мне интересно, могу ли я сделать это в одной строке, подобной bash, '[$ n == $ value] echo "$ n "& & break '.Как выполнить несколько следующих функций в 1 строке в Ruby?

n = 0 
loop do 
    puts n if n == value # puts and break is having the same condition, but 
    break if n == value # can we do it in one line? 
    n += 1 
end 
+0

Вы можете сделать это в одной строке, как было показано, но я бы сказал, что лучший способ написать это на нескольких строках. –

ответ

1

Один простой способ это просто скобки заявления:

ruby-1.9.1-p378 > 0.upto(5) do |n| 
ruby-1.9.1-p378 >  (puts n; break;) if n == 3 
ruby-1.9.1-p378 ?> puts ">>#{n}<<" 
ruby-1.9.1-p378 ?> end 
>>0<< 
>>1<< 
>>2<< 
3 

Если это многовато положить в скобках приведены начать конец будет делать трюк:

0.upto(5) do |n| 
    begin 
     puts "I found a matching n!" 
     puts n 
     puts "And if you multiply it by 10, it is #{10*n}" 
     break; 
    end if n == 3 
    puts "((#{n}))" 
end 

Выход:

 
((0)) 
((1)) 
((2)) 
I found a matching n! 
3 
And if you multiply it by 10, it is 30 
+0

Это потрясающе, спасибо за ваш проницательный ответ! – 2010-06-04 02:44:50

4

Потому что n правдиво, вы можете использовать «и» столяр. Он читает очень красиво:

n = 0 
loop do 
    puts n and break if n == value 
    n += 1 
end 

--edit--

Как было отмечено в комментариях, что на самом деле не работает, потому что ставит возвращает NIL, который не является truthy. Виноват. Вместо этого вы можете использовать «или», но это не очень хорошо читается. Поэтому я бы сказал, что просто группировать заявления с помощью скобок.

n = 0 
loop do 
    (puts n; break) if n == value 
    n += 1 
end 

Можно также изменить способ Кладет вернуть значение, которое он печатает, и это будет работать с «и», но это, вероятно, не самая умная идея :)

Я предполагаю, что ваш фактический код отличается от того, что вы вставили, поэтому, если первый метод в вашей цепочке возвращает что-то, вы можете использовать «и».

+0

Я попробовал, и он постоянно петли, и оператор break не выполняется. – 2010-06-04 02:50:29

+0

Интересно, что в этом случае 'и' ведет себя иначе, чем' && '. Вероятно, какой-то приоритет оператора? Может кто-то прояснить? –

+0

О, мой плохой. puts возвращает nil, поэтому вы не можете использовать 'and'.Приходится использовать «или», который не читает нигде рядом. – zaius

0

Одно из золотых правил Руби является то, что если вы пишете цикл, вы, вероятно, делают это неправильно. В этом конкретном случае все, что делает ваш цикл, - это найти элемент в коллекции. В Ruby уже существует : метод поиска элемента в коллекции: Enumerable#find. Нет необходимости писать свои собственные.

Таким образом, код получает упрощен до:

puts (0...1.0/0).find {|n| n == value } 

Теперь, когда у нас есть хорошая декларативная формулировка задачи, легко видеть, что (при условии, здравомыслящая семантики равенства и здравомыслящей семантика value.to_s), это точно такой же, как:

puts value 

Итак, вся петля совершенно не нужна для начала.

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