Как выполнить несколько последовательных функций в 1 строке в Ruby? - PullRequest
2 голосов
/ 04 июня 2010

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

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

Ответы [ 4 ]

4 голосов
/ 04 июня 2010

Поскольку n является правдивым, вы можете использовать 'и' joiner. Это выглядит очень красиво:

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

- изменить -

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

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

Вы также можете изменить метод put, чтобы он возвращал значение, которое он печатает, и это будет работать с 'и', но это, вероятно, не самая умная идея:)

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

1 голос
/ 04 июня 2010

Один простой способ - заключить в скобки операторы:

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 голосов
/ 04 июня 2010

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

Итак, код упрощается до:

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

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

puts value

Итак, весь цикл был совершенно не нужен для начала.

0 голосов
/ 04 июня 2010

proc { puts n; break; }.() if n == 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...