在Ruby可枚举项中的最后一项上迭代n次
我试图找到一种最干净的方法来为数组中的第一个项目做一些特殊的事情,然后为所有其他项目做一些不同的事情。到目前为止,我有这样的想法:在Ruby可枚举项中的最后一项上迭代n次,ruby,Ruby,我试图找到一种最干净的方法来为数组中的第一个项目做一些特殊的事情,然后为所有其他项目做一些不同的事情。到目前为止,我有这样的想法: puts @model.children.first.full_name @model.children[1..@model.children.count].each do |child| puts child.short_name end 我不喜欢必须指定范围内的计数。我想找一个较短的方式来指定“从第二项到最后一项”。如何做到这一点?您可以采取以下方法: @
puts @model.children.first.full_name
@model.children[1..@model.children.count].each do |child|
puts child.short_name
end
我不喜欢必须指定范围内的计数。我想找一个较短的方式来指定“从第二项到最后一项”。如何做到这一点?您可以采取以下方法:
@model.children[1..-1].each do |child|
puts child.short_name
end
像这样的
puts @model.children.first.full_name
@model.children[1..-1].each do |child|
puts child.short_name
end
您可以使用
drop
:
puts @model.children.first.full_name
@model.children.drop(1).each do |child|
puts child.short_name
end
Ruby使用splat操作符
*
有一种很酷的方法来实现这一点。以下是一个例子:
a = [1,2,3,4]
first, *rest = *a
puts first # 1
puts rest # [2,3,4]
puts a # [1,2,3,4]
以下是您的代码重写:
first, *rest = @model.children
puts first.full_name
rest.each do |child|
puts child.short_name
end
我希望这有帮助 你的标题说你想省略
n
元素,但OP文本只要求特别处理第一个元素。如果您对更通用的nanswer感兴趣,这里有一个简洁的选项:
n = 1 # how many elements to omit
@model.children.drop( n ).map( &:short_name ).each &method( :puts )
如此接近…,可能是我写
put
行的原因:P@JanDvorak什么意思-FGITW。我很笨,不懂缩写形式….:(这个短语的意思是什么?:)元拯救:,和(这就像回答问题里面的问题)哇,很高兴知道:))你们真是太棒了。。。喜欢+1.祝你。。教我一个简短的形式:这是破坏性的行为吗?还是drop返回副本?@Andrewdrop
没有破坏性。对我来说,模式匹配非常优雅+1重复。有一点要记住:在搜索“紧凑”代码时,很容易忽略可读性和可维护性。很明显,[1..@model.children.count]
在做什么。找到做同样事情的替代方法不应该牺牲这一点。使用-1
是替换@model.children.count
的最明显的捷径。put@model.children.drop(n)。map(&:short\u name)
也会奏效。是吗?我不太熟悉puts处理参数的方式,我喜欢推广最近别人教我的&method(…)
技巧。是的,puts
使用数组和单个元素。对于数组,它迭代它们,将每个元素放在一行上。是的,&method(…)
是一个很好的技巧,但它是一个闪亮的新锤子,并不是所有的东西都需要用它来敲击。感谢您的解释,尤其是关于推杆的解释。很多时候,我使用了puts
,我从不费心阅读文档或其源代码,多亏了您,我已经纠正了这一点:-))