Rubyの配列があるとしましょう
a = [1, 2, 3, 4]
最初のアイテム以外すべてが必要な場合は、と書けa.drop(1)
ます。これは素晴らしいことです。もし最後のアイテム以外が欲しいなら、このようにしか考えられない
a[0..-2] # or
a[0...-1]
しかし、これらはどちらもを使用するほどきれいには見えませんdrop
。他に欠けている組み込みの方法はありますか?
Rubyの配列があるとしましょう
a = [1, 2, 3, 4]
最初のアイテム以外すべてが必要な場合は、と書けa.drop(1)
ます。これは素晴らしいことです。もし最後のアイテム以外が欲しいなら、このようにしか考えられない
a[0..-2] # or
a[0...-1]
しかし、これらはどちらもを使用するほどきれいには見えませんdrop
。他に欠けている組み込みの方法はありますか?
回答:
たぶん...
a = t # => [1, 2, 3, 4]
a.first a.size - 1 # => [1, 2, 3]
または
a.take 3
または
a.first 3
または
a.pop
最後を返し、配列の前にすべてを残します
または、夕食時にコンピュータを機能させる:
a.reverse.drop(1).reverse
または
class Array
def clip n=1
take size - n
end
end
a # => [1, 2, 3, 4]
a.clip # => [1, 2, 3]
a = a + a # => [1, 2, 3, 4, 1, 2, 3, 4]
a.clip 2 # => [1, 2, 3, 4, 1, 2]
Array
は、私にとって最良のアプローチのようです。ほとんどのプロジェクトは、core_ext.rb
このような小さな拡張子の付いたファイルになってしまいます。一部のライブラリは、たとえば次のような実質的にすべての拡張機能ActiveSupport
です。
clip
メソッドをRubyコミュニティにどのように提出しますか?私は本当にこれがそこにあるはずだと思います、そしてモンキーパッチは間違ったものです。
a.reverse.drop(1).reverse
戦略が好きです。;-)
好奇心から、a[0...-1]
いかがですか?配列のスライスを取得したいので、スライス演算子は慣用的な選択のように見えます。
しかし、これを至る所で呼び出す必要がある場合は、DigitalRossが提案するように、Arrayクラスにわかりやすい名前のメソッドを追加するオプションが常にあります。おそらくこのように:
class Array
def drop_last
self[0...-1]
end
end
drop_last
ちなみに私はあなたの名前を好む...
.
ですか?
nil
ます:[][1..-1]
-> nil
、[][0...-1]
->[]
別のクールなトリック
>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
a, *b = [1,2,3]
で、アレイをクラシックカー/ cdrの方法で確認できます。
pop()
配列に対して操作を実行したい場合(最後の項目が削除されることになります)、ポップされた要素の代わりに配列を取得したい場合は、以下を使用できますtap(&:pop)
。
> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]
a[0...-1]
最良の方法のようです。配列スライス構文は、まさにこの目的のために作成されました...
または、配列を適切に変更してもかまわない場合は、次のように呼び出しますa.pop
。
>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
b = a.pop
1行の最後の要素を取り除き、残りを返すには
[1, 2, 4, 5, 6].reverse.drop(1).reverse
でも真剣に
[1,2,3,4][0..-2]
#=> [1,2,3]
これが方法です:
[1,2,3,4,5][0..-1-1]
しかし、これがどのように機能するかを説明しましょう:
a = [1,2,3,4,5]
次の例では、0位置から最後までのすべてのレコードを返します
a[0..-1]
=> [1, 2, 3, 4, 5]
次の例は、1つの位置から最後のレコードを返します
a[1..-1]
=> [2, 3, 4, 5]
そしてここにあなたが必要なものがあります。次の例では、0位置から最後の1までのレコードを返します
a[0..-1-1]
=> [1, 2, 3, 4]
-2
代わりに書くことができます-1-1
。
回答: a.τwτ
、ただし最初にPyperをインストールする必要があります...
イントロPyper: Doが、あなたはLispyのを知っているcar
し、cdr
「最初の」と配列の「休息」を返しますか?あなたのようなニーズのために、私はこのLispyメカニズムの拡張を行いました。それはと呼ばれpyper
、2番目、2番目からの残り、3番目からの残り、3番目からの残り、最後、最後を除くすべてにアクセスすることを可能にします。caar
、cadr
、cdadar
などのLispから知られています:
# First, gem install pyper
require 'pyper'
include Pyper
a = %w/lorem ipsum dolor sit amet/
# To avoid confusion with other methods, and also because it resembles a rain gutter,
# Greek letter τ is used to delimit Pyper methods:
a.τaτ #=> "lorem"
a.τdτ #=> ["ipsum", "dolor", "sit", "amet"]
a.τbτ #=> "ipsum"
a.τeτ #=> ["dolor", "sit", "amet"]
a.τcτ #=> "dolor" (3rd)
a.τzτ #=> "amet" (last)
a.τyτ #=> "sit" (2nd from the end)
a.τxτ #=> "dolor" (3rd from the end)
そして最後に、あなたの質問への答え:
a.τwτ #=> ["lorem", "ipsum", "dolor", "sit"] (all except last)
もっとある:
a.τuτ #=> ["lorem", "ipsum", "dolor"] (all except last 2)
a.τ1τ #=> ["lorem", "ipsum"] (first 2)
a.τ8τ #=> (last 2)
a.τ7τ #=> (last 3)
構成:
a.τwydτ #=> "olor" (all except 1st letter of the last word of all-except-last array)
また、コマンド文字には、マップを意味するだけa..f
でu..z
なく0..9
、最も重要なものm
もあります。
a.τwmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)
しかし、他のコマンド文字は非常に熱く、現時点では簡単に使用できません。
これにより、元の最後の要素を除くすべての新しい配列が作成されます。
ary2 = ary.dup
ary2.pop
他のいくつかは#popの使用を提案していることに注意してください。配列を適切に変更しても問題ない場合は、それで問題ありません。これで問題ない場合は、この例のように、まず配列を複製してください。
私はしばしば、配列の最後のn個の要素以外をすべて欲しがっています。私は他のソリューションよりも読みやすい方法でこれを行うために自分の関数を作り上げました:
class Array
def all_but_the_last(n)
self.first(self.size - n)
end
end
これで、次のことができるようになります。
arr = ["One", "Two", "Three", "Four", "Five"]
# => ["One", "Two", "Three", "Four", "Five"]
arr.all_but_the_last(1)
# => ["One", "Two", "Three", "Four"]
arr.all_but_the_last(3)
# => ["One", "Two"]
arr.all_but_the_last(5)
# => []
arr.all_but_the_last(6)
# ArgumentError: negative array size
ArgumentErrorを故意に許可して、呼び出し元がこのメソッドの使用方法を担当するようにしました。このアプローチについてのコメント/批評を聞きたいです。