2015-11-23 4 views
0

Я работаю над модулем для форматирования вывода на печать для консоли. Проблема, с которой я сталкиваюсь, - это когда я вызываю .each на массив, который у меня есть, он возвращает массив в консоли. Мне нужно контролировать, что возвращается в консоль.Итерация по массиву без возврата массива

Как я могу перебирать массив без возврата массива в консоль?

@values.each do |value| # The end result of this is being returned, do not want. 
    printf(@format, 
     value[0], value[1], value[2], value[3], value[4], value[5], 
     value[6] 
) 
end 
+1

Либо добавить '; nil' или просто ';'. –

ответ

2

Почему бы не создать метод для желаемого поведения?

def print_each_value(values, format) 
    values.each do |value| 
    printf(format, value[0], value[1], value[2], value[3], value[4], value[5], value[6]) 
    end 
    nil # Here you set what you would like to return to the console. 
end 

print_each_value(@values, @format) 

Редактировать: Удалена аннотативная переменная.

+0

Абсолютно, я добавил только переменную, потому что исходный вопрос явно сказал: «Мне нужно контролировать то, что возвращается в совете». – BenNapp

+0

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

+0

Ничего себе, не думал, что все так просто. – theartofbeing

0

Добавить ; в конец.

@values.each do |value| # The end result of this is being returned, do not want. 
    printf(@format, 
    value[0], value[1], value[2], value[3], value[4], value[5], 
    value[6]) 
end; 

Вы можете увидеть объяснение в this article.

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

И basicaly ; в Ruby, используется для построения цепочки.

+0

Не могли бы вы добавить ссылку на документацию или что-то, что объясняет _why_, это работает? – onebree

+0

Это потому, что после точки с запятой есть пустое утверждение. – tadman

+0

Это само по себе не сработало. Он все еще возвращает массив. – theartofbeing

0

Если вас интересует только вывод, а не промежуточный массив, который будет отображаться в интерактивном Ruby, у вас есть два варианта. Во-первых, передать значение, которое вы хотите возвращенного:

@values.each_with_object(nil) do |value, x| 
    # ... 
end 

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

Второй возвратить строки и печатать те:

puts(
    @values.collect do |value| 
    @format % values 
    end.join("\n") 
) 

Это имеет то преимущество, что значительно упрощает ваш звонок.

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

printf(@format, *values)