【问题标题】:how to cycle with whole arrays ruby on rails如何在轨道上循环使用整个数组 ruby
【发布时间】:2010-07-18 10:02:35
【问题描述】:

我还是 ruby​​ on rails 和 web 开发的新手,所以请多多包涵:

我有两个数组 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

【问题讨论】:

  • @Karl 回答解释了你得到的行为。但是你能解释一下你想要达到什么目的吗?您的示例代码看起来很糟糕,我希望您不要在任何地方使用它(或非常相似的东西)。 cycle 是文本助手。在我看来,您不应该随意使用它。

标签: ruby-on-rails cycle


【解决方案1】:

我相信 cycle() 的工作方式,它将输出转换为字符串。所以当你调用@tempt_array[0]时,它会返回类似"1234567"[0]的东西

我在控制台中的测试返回了我的预期:

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

我相信这些是“1”、“2”和“3”的 ASCII 字符代码,如下所示:http://www.asciitable.com/

您可能需要编写自己的枚举器方法,或者找到一个不同的方法来使用。

【讨论】:

    【解决方案2】:

    我承认我什至不确定您的代码现在是如何工作的,因为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 方法实际上更接近于您正在寻找的方法。

    【讨论】:

    • 说实话,我什至不知道 Enumerable#cycle 存在。我会更多地阅读它。谢谢你的建议。基本上,我有 10 行单选按钮。第一行应该代表从 1 到 7 的值。第二行代表从 7 到 1 的值。这对于每一行都是交替的。我想更简单的方法就是修改索引以查看它是偶数行还是奇数行,然后选择从中获取值的数组。我只是不知道如何使用 ruby​​ on rails 的条件,或者我只是一个糟糕的 googler =(。谢谢你!
    【解决方案3】:

    你也可以完全切断循环,直接使用

    @temp_array = @good_array.zip(@bad_array).flatten
    
    [1,2,3].zip([3,4,5]).flatten #  => [1, 3, 2, 4, 3, 5]
    

    【讨论】:

    • 哦,这可能是他的想法。我以为他的意思是将数组首尾相连,但以这种方式穿插可能是正确的。
    • 我想避免构建一个超长的值数组。因为每次我添加一行单选按钮时,都会导致我将更多数组附加在一起。谢谢!!
    【解决方案4】:

    这就是我认为您正在尝试做的事情,尽管我不能 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 %>
    

    【讨论】:

    • 实际上你给了我需要尝试的最简单的解决方案。我只是不知道条件语句如何在 ruby​​ on rails 中用于查看页面。我是一名 C++ 程序员,对 Web 开发非常陌生。我可以查看索引是否 % 2 == 0 来确定它是旧的还是偶数,然后根据它选择要从中获取值的数组。只是想澄清一下, 代表 ruby​​ 代码。那么这些括号中的任何内容都可以是 ruby​​ 代码吗?如果那是一个愚蠢的问题,再次抱歉。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多