Sinatra: помощник и диапазон ruby

#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.