8

Ruby では、 Array#sliceandがandとArray#slice!は異なる動作をする理由を理解できませんでした (1 つは新しい配列で結果を返し、もう 1 つは現在のオブジェクトで動作します)。Array#sortArray#sort!

最初のもの (強打なし)ではsort、現在の配列の並べ替えられたコピーを返し、現在の配列を並べ替えますsort!

slice、指定された範囲の配列を返し、指定された範囲を現在のオブジェクトからslice! 削除します。

Array#slice!現在のオブジェクトを指定された範囲の配列にするのではなく、このように動作する理由は何ですか?

例:

a = [0,1,2,3,4,5,6,7,8,9]

b = a.slice( 2,2 )

puts "slice:"
puts "  a = " + a.inspect
puts "  b = " + b.inspect

b = a.slice!(2,2)
puts "slice!:"
puts "  a = " + a.inspect
puts "  b = " + b.inspect

出力:

slice:
  a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  b = [2, 3]
slice!:
  a = [0, 1, 4, 5, 6, 7, 8, 9]
  b = [2, 3]

http://ideone.com/77xFva

4

3 に答える 3

3

#sliceと の#slice!動作は同等です。どちらも「開始インデックスから長さの要素まで続く部分配列を返します」、ソートされた配列を返す、または逆の配列を返す#sortと同じ方法です。#sort!#reverse#reverse!

違いは、bang メソッドはオブジェクト自体も変更することです。

a = [4,2,6,9,1,5,8]
b = a.dup
a.sort == b.sort!             # => true
a == b                        # => false

b = a.dup
a.reverse == b.reverse!       # => true
a == b                        # => false

b = a.dup
a.slice(2,2) == b.slice!(2,2) # => true
a == b                        # => false
于 2014-01-07T17:55:46.500 に答える
1

!または ruby​​ の bang メソッドは通常、新しいオブジェクトを返す同等の非 bang メソッドではなく、既存のオブジェクトを変更します。既存のオブジェクトを変更する場合は、bang メソッド オプションを使用します。

編集:設計上の決定に対処するために、私はマッツではありませんが、の性質はsliceサブセットを返すことであるため、それぞれの場合にサブセットを返すと推測します。のような他の bang メソッドの場合gsub、またはsort文字列/オブジェクト全体を (潜在的に) 変更しているため、コピーを返すか、元の変更を返します。

于 2014-01-07T16:59:04.977 に答える