2015-09-30 70 views
0

如何在Array中將self更改爲全新陣列?我如何填寫下面的評論部分?是否可以改變一個Array對象的長度?

class Array 
    def change_self 
    #make this array be `[5,5,5]` 
    end 
end 

我明白這一點:Why can't I change the value of self?,知道我不能只分配給self一個新的對象。當我這樣做:

arr = [1,2,3,4,5] 

arr包含對Array對象的引用。我可以添加一個方法Array類改變一個數組,喜歡的東西:

self[0] = 100 

但有可能改變由arr引用的數組的長度? 這些值如何存儲在Array對象中?

回答

5

你問你的標題和文本中的三個非常不同的問題:

是否有可能使用Array方法來改變一個Array對象的長度?

是的,有20種方法,可以(可能)改變Array的長度:

  • <<增加1
  • []=長度可任意地改變長度,這取決於參數
  • clear設置長度爲0
  • compact!可以減少長度,這取決於內容
  • concat可以增加長度,這取決於參數
  • delete可以減少長度,這取決於參數和內容
  • delete_at可以減少長度,這取決於參數
  • delete_if/reject!可以減少長度,這取決於論據和內容
  • fill可以增加長度,具體取決於參數
  • insert增加長度
  • keep_if/select!可以減少長度,這取決於參數和內容
  • pop減小長度
  • push增加長度
  • replace可改變長度任意地,這取決於參數和內容(它簡單地替換Array完全不同Array
  • shift減小長度
  • slice!減小長度
  • uniq!可以減少長度,取決於內容
  • unshift長度的增加

當猴子修補Array類,一個人如何改變「自我」是一個全新的陣列?我如何填寫下面的評論部分?

class Array 
def change_self 
    #make this array be [5,5,5] no matter what 
end 
end 
class Array 
    def change_self 
    replace([5, 5, 5]) 
    end 
end 

如何將這些值實際存儲在Array對象?

我們不知道。 Ruby語言規範沒有規定任何特定的存儲機制或實現策略。只要他們服從Array方法的契約,執行者可以自由地以任何方式實施Array

作爲一個例子,這裏的在RubiniusArray實現,我發現相當可讀的(至少如此比YARV):

爲了便於比較,這裏是Topaz的實現:

而且JRuby

2

由於Array是mutables,你可以改變它的內容:

class Array 
    def change_self 
    self.clear 
    self.concat [5, 5, 5] 
    end 
end 

您修改數組所以它變空,然後添加所有從目標數組中的元素。它們仍然是兩個不同的對象(即,myAry.object_id將不同於[5, 5, 5].object_id),但現在它們是等效陣列。

此外,陣列還是一樣之前 - 只是它的內容改爲:

myAry = [1, 2, 3] 
otherRef = myAry 
previousId = myAry.object_id 
previousHash = myAry.hash 
myAry.change_self 
puts "myAry is now #{myAry}" 
puts "Hash changed from #{previousHash} to #{myAry.hash}" 
puts "ID #{previousId} remained as #{myAry.object_id}, as it's still the same instance" 
puts "otherRef points to the same instance - it shows the changes, too: #{otherRef}" 

不管怎樣,我真的不知道爲什麼人會想這樣做 - 你解決的權利問題,還是隻是在開玩笑呢?

4
arr = [1,2,3,4,5] 
arr.replace([5,5,5]) 

我不會在陣列中將新方法猴子修補;特別是因爲它已經存在。 Array#replace

+0

你也可以使用[陣列#[\] =](http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D-3D):'arr = [1,2,3]; id = arr.object_id; arr [0..-1] = [4,5]; arr#=> [4,5]; arr.object_id == id#=> true'。 –

相關問題