2

I am trying to find the cleanest way to do something special for the first item in an array, then do something different for all the rest. So far I have something like this:

puts @model.children.first.full_name
@model.children[1..@model.children.count].each do |child|
  puts child.short_name
end

I don't like how I have to specify the count in the range. I would like to find a shorter way to specify "from the second item to the last". How can this be done?

4

5 に答える 5

10

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

これが役立つことを願っています!

于 2013-07-02T21:55:56.893 に答える
6

このアプローチを取ることができます:

@model.children[1..-1].each do |child|
  puts child.short_name
end
于 2013-07-02T21:30:11.303 に答える
4

あなたは使用するかもしれませんdrop

puts @model.children.first.full_name
@model.children.drop(1).each do |child|
  puts child.short_name
end
于 2013-07-02T21:30:56.550 に答える
3

このようなもの?:

puts @model.children.first.full_name
@model.children[1..-1].each do |child|
  puts child.short_name
end
于 2013-07-02T21:30:20.030 に答える
0

あなたのタイトルはn要素を省略したいと言っていますが、OPテキストは最初の要素を特別に扱うことだけを求めています. より一般的な nanswer に興味がある場合は、簡潔なオプションを 1 つ示します。

n = 1 # how many elements to omit
@model.children.drop( n ).map( &:short_name ).each &method( :puts )
于 2013-07-02T22:18:28.247 に答える