#ruby #sinatra #range
#ruby #sinatra #диапазон
Вопрос:
Я пытался использовать диапазон для повторения в Sinatra.
когда я пытаюсь что-то вроде
helpers do
def iteration
(1..6).each do |x|
x
end
end
end
и вызовите помощника из моего приложения, он выведет 1 ..6
если я изменю на
(1..6).to_a do #...
он печатает 123456
это нормально? или мне нужно потребовать что-то еще в моем приложении, чтобы иметь возможность использовать диапазон?
Ответ №1:
Вам все равно нужно будет вызвать each
:
(1..6).to_a.each do ...
В вашем вспомогательном методе вы на самом деле ничего не делаете. iteration
Метод просто вернет результат последнего оператора в методе; each
возвращает переданный ему аргумент, так что это то, что отображается.
Комментарии:
1. Я знаю, что это ничего не делает, я просто тестировал это. Я попробовал с to_a, поскольку Sinatra, похоже, не понимает каждый из диапазонов, и я хотел проверить, верно ли это. К моему удивлению, он выполняет итерацию по массиву без вызова каждого из них.
Ответ №2:
helpers do
def iteration
(1..6).each do |x|
x
#it dosen't mean output the 123456, this just let the method return a value 1..6
#in other words, it still iteras the array in backgroud,
#but not outputs in terminal, you can't see it.
print x
#it prints 123456, really
end
end
end
Редактировать
В Sinatra это можно сделать следующим образом
get '/t' do
#it will output the 123456
body = ""
(1..6).each do |x|
body << x.to_s
end
body
end
Комментарии:
1. Я пытался найти способ вывода html-кода из помощника с помощью Sinatra (мог бы использовать markaby, но мне нужно дождаться, пока ОН dpt решит, устанавливать его или нет). итак, я хотел перебрать диапазон для вывода разметки. но не смог заставить это работать в sinatra. хотя в irb все в порядке.
2. Или, используя шаблон в Sinatra в качестве вашего сообщения с ответом.
Ответ №3:
Я пытался найти способ вывода html-кода из помощника с помощью Sinatra (мог бы использовать markaby, но мне нужно дождаться, пока ОН dpt решит, устанавливать его или нет). итак, я хотел перебрать диапазон для вывода разметки. но не смог заставить это работать в sinatra. хотя в irb все в порядке.
В конце концов, это то, что я сделал
def tag_iterator
(1..6).map do |x|
"<p>#{x}</p>"
end
end
В шаблоне:
__END__
@@index
%h1= @title
.test
%div= "#{tag_iterator}"
И теперь он проходит через диапазон в обычном режиме. Я думаю, Ruby для меня слишком волшебный, я могу часами гадать, как все работает: ^ P
Комментарии:
1.
each
выполняется исключительно из-за побочного эффекта (например, печати на экране сputs
помощью), и в вашем исходном сообщении его не было.map
с другой стороны, используется для сбора значений, возвращаемых блоком (отсюдаcollect
и псевдоним для него), и поэтому вы на самом деле получаете то, что хотели. Никакой магии не требуется. Кстати: ваш исходный пример напечатан1..6
, потомуeach
что возвращает объект, на который он был вызван.2. Добро пожаловать! 🙂 В Интернете есть несколько отличных ресурсов Ruby, таких как RubyLearning, Code School и т. Д., Возможно, вы захотите использовать один из них, чтобы начать изучение Ruby.