1

我正在做一些 koans 练习,但无法理解数组中使用符号返回的值。有人可以解释为什么以下内容相同或建议一篇关于该主题的好文章,我可以从中推断出正确的知识吗???这与字符串不同:

    array = [:peanut, :butter, :and, :jelly]

     assert_equal [:and, :jelly], array[2,2]
     assert_equal [:and, :jelly], array[2,20]
     assert_equal [:jelly, :peanut], array[4,0]
     assert_equal [:jelly, :jelly], array[4,100]
4

4 回答 4

2

在我看来,您从错误的角度看待结果。这里断言的是数组的切片。如果你像这样切片一个数组

array[start_index, length]

这意味着您从具有特定长度的特定索引开始获取子数组。这样你的例子就有意义了。

数组中的元素类型实际上并不重要。

另请参阅Ruby 的 array#slice 文档

于 2013-11-13T23:26:06.783 回答
1

立即查看并始终查看文档ary[start, length] → new_ary or nil

它返回子数组。这里的“开始”是数组中第一个元素的索引,length代表子数组的长度。如果length >= ary.size - start您将从startary 的末尾获取子数组。

在你的情况下:

array = [:peanut, :butter, :and, :jelly]   
array[2, 2] #=>  [:and, jelly]
array[2,20] #=>  [:and, jelly]
array[4, 0] #=> []; length of empty array is 0!
array[4, 100] #=> []; well, okay. There's no element with index equal to 4.
             # but holy documentation says "empty array is returned when 
             # the starting index for an element range is at the end of 
             # the array."
array[5, 0]  #=> nil; there's nothing at 5th position.
array[-2, 2] #=> [:and, jelly]; :)

你告诉过数组中的字符串不是这样的吗?你必须面对黑魔法。你能给我举个例子吗?

于 2013-11-13T23:57:28.930 回答
0

还要看values_at方法:

array = [:peanut, :butter, :and, :jelly]
p array.values_at(2,0) #=> [:and, :peanut]
于 2013-11-14T08:25:23.213 回答
0

小写%i代表

非插值符号数组,由空格分隔(Ruby 2.0 之后)

另外,大写%I表示

插值符号数组,由空格分隔(Ruby 2.0 之后)

a = 2

%i{one two #{a}+three} # Interpolation is ignored

 => [:one, :two, :"\#{a}+three"]

%I{one two #{a}+three} # Interpolation works

 => [:one, :two, :"1+three"]

https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals

%i{one two three} # after Ruby 2.0 => [:one, :two, :three]
于 2018-02-22T07:07:29.977 回答