どうするかどうかを試験Rubyのオブジェクトは不変なので?

StackOverflow https://stackoverflow.com/questions/455379

  •  19-08-2019
  •  | 
  •  

質問

やめるかどうかを試験するオブジェクトは不変なので(番号、nilない(配列、ハッシュオブジェクト)?その他の言葉が入っているのか、それとも変更による影響その他のコードについて教えてください。

意欲:作りたい番号の値の店舗が、一部のデータをarrays.一部の配列ンカスタムオブジェクトは、私は反転の関係を格納する"の物件検索ができます。がたいもので店舗配列のシンボル、その他の配列などを扱います。

役に立ちましたか?

解決

ありませんプリミティブオブジェRubyなどがある。ここではそのため検出されない率直に示してゆくことが必要だ。

できないだけで使用MarshalはYAML用収録。しょに読み込みと保存の全てのオブジェクトの種類は無料です。なぜかをやり直しかないのか。

どうなるかはわからないがする"想い"いかがでしたでしょがみの源泉はYAMLのも面白いのかを取り扱っています。RubyのYAMLエンコード実装は、単に実装し、 to_yaml 方法のためのすべての関連する。見 yaml/rubytypes.rb.

他のヒント

非効率的な方法を見つけました:

class Object
  def primitive?
    begin
      self.dup
      false
    rescue TypeError
      true
    end
  end
end

可変性の概念は、他の言語と同じ方法でRubyに実際に適用されるわけではありません。唯一の不変オブジェクトは凍結されたオブジェクトです。 Fixnumにメソッドとインスタンス変数を追加することもできます。例:

class Fixnum
  attr_accessor :name
end
1.name = "one"
2.name = "two"

明らかに、ほとんどの場合、人々はFixnumに属性を追加するのに十分なほど病理学的ではありませんが、ポイントは、凍結されていないオブジェクトが本当に不変ではないということです。

不変であると想定するクラスの標準的なリストを思い付くことができる場合は、すべてを通過して、trueを返すすべてのimmutable?()メソッドを与えることができます(Objectはfalseを返すバージョンです)。しかし、wvanbergenが言ったように、オブジェクトのコピーが変更されないようにする最善の方法は、Marshalでそれを深くコピーすることです。

別の違い:ネイティブに不変のオブジェクトは凍結することはできませんが、凍結からfalseを返しますか?

5.freeze.frozen? == false

フリーズは(dupとは異なり)例外を発生させませんが、(永続的に!)可変オブジェクトを変更します。

(少なくとも現在の状態では)アプリをフリーズしたオブジェクトで動作するように調整できることがわかりました。それらを直接変更しようとすると、rubyから例外が発生します。ただし、フリーズはオブジェクトの最初のレベルにのみ影響します。その中に格納されている配列などは引き続き変更できます。

これは1.8-5.凍結のみに適用されますか? ruby1.9ではtrueを返します(irb1.9ではそうではありません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top