2011-12-06 2 views
1

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

bar = 15 
foo = 5 
10.times { foo = foo + 1 } 
puts foo == bar 

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

+0

Вы не меняете 'answer_should_be', не так ли? И затем вы проверяете, изменилось это или нет. Здесь что-то странное. –

+0

Извините, код примера был вздор! Спасибо, что указал, что теперь, исправлено, я надеюсь. –

+0

В вашем реальном коде вам нужно, чтобы для 'Fixnum' как в примере или для некоторых изменяемых объектов, таких как строки или массивы? Кстати, вы «одна строка» - довольно опасное ограничение: вы можете написать пример в одной строке, разделяющей инструкции с полуколонами =) –

ответ

3

Возможно, Enumerable#reduce поможет.

puts (0..9).reduce(5) { |acc, _| acc + 1 } == 15 

Число итераций передается в качестве объекта, reduce вызывается. Начальное значение передается как аргумент reduce. Действие выполняется в блоке, и результат каждого выполнения переносится через итерации в качестве первого аргумента блока.

Единственное, чего не хватает, это назначения переменных. Давай сделаем это.

puts (foo = (0..9).reduce(5) { |acc, _| acc + 1 }) == bar = 15 

Так что да, это это возможно, однако я бы рекомендовал многословный, многострочный и читаемый решение.

+0

Альтернативный способ :) Array.new (10, 1) .инъект (5) {| sum, el | sum + el} == 15 –

+0

Блестящий, спасибо за это, и да, я ценю, что читаемость лучше всего, будет стараться и рефакторировать красиво, просто хотела бы посмотреть, можно ли это сделать :) –

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