как ездить с целыми массивами ruby ​​на рельсах - PullRequest
0 голосов
/ 17 июля 2010

Я все еще новичок в ruby ​​по рельсам и веб-разработке, поэтому, пожалуйста, потерпите меня:

У меня есть два массива a1 = [1,2,3,4] b1 = [7,6,5,4]

Я хочу чередовать, какой массив я использую; переключение между a1 [] и b1 [].

В настоящее время я пытаюсь использовать команду cycle () для достижения этой цели.

<% @good_bad = [7,6,5,4,3,2,1] %>
<% @bad_good = [1,2,3,4,5,6,7] %>
WITHOUT CYCLE:</br>
   <% @super = @bad_good%>
   <%= @super%>
   <%= @super[0]%>
   <%= @super[1]%>
   <%= @super[2]%>
WITH CYCLE: </br>
    <% @temp_array = cycle(@bad_good , @good_bad , :name => "rating")%>
    <%= @temp_array%>
    <%= @temp_array[0]%>
    <%= @temp_array[1]%>
    <%= @temp_array[2]%>

Это отобразит:

ЕГО ЦИКЛ: 1234567 1 2 3 С ЦИКЛОМ: 1234567 49 50 51

Я бы ожидал, что распечатка будет такой же, поскольку в первом цикле она хранит @temp в @bad_good.

Вероятно, есть что-то базовое, чего мне не хватает. Странно, как, когда я пытаюсь получить единичные значения массива, он выводит 49,50,51, но когда я распечатываю весь массив, это точно?

Любой совет приветствуется, Спасибо, D

Ответы [ 4 ]

3 голосов
/ 17 июля 2010

Я полагаю, как работает цикл (), он преобразует вывод в строку. Поэтому, когда вы звоните @tempt_array[0], он возвращает что-то вроде "1234567"[0]

Мои тесты в консоли вернули то, что я ожидал:

"1234567".to_s[0]
=> 49
"1234567".to_s[1]
=> 50
"1234567".to_s[2]
=> 51

Я считаю, что это коды символов ASCII для "1", "2" и "3", как показано здесь: http://www.asciitable.com/

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

2 голосов
/ 17 июля 2010

Я признаю, что я даже не уверен, как работает ваш код сейчас, потому что cycle - это метод Enumerable, и вы, похоже, не вызываете его для какого-либо перечисляемого объекта.

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

(array1 + array2).cycle

Так, например:

array1 = 1.upto(7).to_a
array2 = 7.downto(1).to_a
sequence = (array1 + array2).cycle
sequence.take 49 
# => [1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7]

Редактировать: объяснение Карла предоставило недостающую часть. Я думал о Enumerable#cycle, но это TextHelpers#cycle. Я думаю, что метод Enumerable на самом деле ближе к тому, что вы искали.

1 голос
/ 17 июля 2010

Вы также можете полностью вырезать цикл и просто использовать

@temp_array = @good_array.zip(@bad_array).flatten

[1,2,3].zip([3,4,5]).flatten #  => [1, 3, 2, 4, 3, 5]
0 голосов
/ 17 июля 2010

Вот то, что я думаю, вы пытаетесь сделать, хотя я не уверен на 100%:

a1 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
a2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

a1.zip(a2).each_with_index{|array, index| array.reverse! if index % 2 == 0}.map{|a| a.first}
# => ["a", "B", "c", "D", "e", "F", "g", "H", "i", "J"]

# Alternatively:
a1.zip(a2).each_with_index{|array, index| array.reverse! unless index % 2 == 0}.map{|a| a.first}
# => ["A", "b", "C", "d", "E", "f", "G", "h", "I", "j"]

Я уверен, что есть более короткий способ сделать это, но я не могу думать об этом прямо сейчас.

Изменить: Чтобы ответить на ваши вопросы в комментарии - и <%%>, и <% =%> запустят содержащийся в них код ruby, но второй выведет ответ на HTML, а первый - , Поэтому условные высказывания обычно ставятся на первое место. Так, например, вы можете сделать:

<% if @user.admin? %>
  <%= edit_link %>
<% else %>
  You're not an admin!
<% end %>
...