Ruby或Ruby on Rails(框架)中是否有Head和Tail方法?

9

1
你认为 tail 方法会返回什么?集合的最后一个元素还是除了头部以外的整个集合? - toro2k
@toro2k tail 通常是除了 head 之外的所有内容。如果你想要最后一个元素,你应该调用/定义 last 方法。然而,那个链接的 Java 问题很令人困惑,因为那里的 tail 方法只返回最后一个元素。 - tolgap
@tolgap 这正是问题所在,对于 OP 来说,什么是“tail”根本不清楚。 - toro2k
4个回答

24

这里有一个可能性:

head, *tail = args

它使用了Ruby的展开运算符。

示例:

args = [1, 2, 3, 4, 5, 6, 7, 8]
# => [1, 2, 3, 4, 5, 6, 7, 8]
head, *tail = args
head
# => 1
tail
# => [2, 3, 4, 5, 6, 7, 8]

不需要对 args 使用splat操作符,因为它已经是一个数组了,head, *tail = args 将会达到你期望的效果。 - toro2k
@tolgap 不错!但是 'Tail' 是可变的,对吧?如果我想在下一个循环中继续运行这个程序,这个 'tail' 就不是不可变的了,对吧?在 Ruby 中让事情不可变需要做太多工作了,我猜 :-( - YoniGeek
@YoniGeek,“tail”变量确实是可变的,但它不是你问题中要求不可变的一部分。 - tolgap
@tolgap 这是正确的!嘿,听我说,如果“tail”变量必须是不可变的,你会怎么做? - YoniGeek

2

Ruby数组支持 firstlast 方法。同样,ActiveRecord 也暴露了相同的方法来查询数据库。


2

我认为在 ruby 的核心库或标准库中没有这样的东西。但是如果你喜欢函数式风格,你可以自己实现一个并避免像这样进行猴子补丁:

def head(n)
  n.to_a[0]
end

def tail(n)
  n.to_a[1..-1]
end

to_a是必需的,如果您想支持数组和可枚举对象。因此,您可以像这样调用它:

>> head [1, 2, 3, 4, 5]
=> 1
>> tail [1, 2, 3, 4, 5]
=> [2, 3, 4, 5]
>> head 1..10
=> 1
>> tail 1..10
=> [2, 3, 4, 5, 6, 7, 8, 9, 10]

0
如果你正在考虑ActiveRecord,你可以使用first和last:
Unit.first(5)
-> Unit Load (5.3ms)  SELECT `units`.* FROM `units` LIMIT 5
Unit.last(5)
-> Unit Load (1.7ms)  SELECT `units`.* FROM `units` ORDER BY id DESC LIMIT 5

或者,一个数组(列表):

units.first(5) # first 5
units[0,5]    # first 5
units[0..4]   # first 5
units.last(5) # last 5
units[-5,5]   # last 5
units[-5..-1] # last 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接