2017-03-12 5 views
0

以下のコードスニペットはオブジェクトを返します。Rubyオブジェクト対ハッシュ

class Person 
    def initialize(name, gender) 
    @name = name 
    @gender = gender 
    end 
end 
x = Person.new("Dan", "M") 
=> #<Person:0x007f6f96600560 @name="Dan", @gender="M"> 
  • オブジェクト<...>とハッシュ{ ... }の違いは何ですか?なぜRubyクラスはハッシュを返さないのでしょうか?
  • オブジェクトには0x007f6f96600560とは何ですか?私はそれがobject_idではないと確信しています。
+3

'0x00 ...'は '(object_id << 1).to_s(16)'( 'object_id'、16進数で1つ左にシフトしています。)オブジェクトが何であるかについては、たくさんの本が書かれています。あなたはこの種の質問のために、何年も勉強して多くの本を読んでいるので、SOの答えを受け取ることを期待してはいけません。 – mudasobwa

+1

OPは、すべてのクラスを 'Hash'からサブクラス化し、インスタンス変数名と値をキーと値のペアとして格納することを暗黙のうちに示唆しているようです。実際には、JavaScriptはいくらか似ています。 – sawa

+3

短い答え:Rubyは[プロトタイプベースの言語](https://en.wikipedia.org/wiki/Prototype-based_programming)ではないためです。 –

答えて

0

もちろん、オブジェクトとハッシュを同じように使うことができます。このように、キーと値のペアのOBオブジェクトを格納:

[3] pry(main)> class Person 
    def initialize(name, gender) 
    @name = name 
    @gender = gender 
    end 
end 

[3] pry(main)* => :initialize 

[4] pry(main)> x = Person.new("Dan", "M") 
=> #<Person:0x00000003708098 @gender="M", @name="Dan"> 


[13] pry(main)> y = Person.new("Peter", "M") 
=> #<Person:0x0000000391fca0 @gender="M", @name="Peter"> 


[22] pry(main)> z = {name: "Maria", gender: "F"} 
=> {:name=>"Maria", :gender=>"F"} 

しかし、これは本当にオブジェクトはclass/objecthashの定義からオブジェクトオリエンテプログラミング言語のすべての力を得ることはありません。

Rubyがあります完璧なオブジェクト指向プログラミング言語です。オブジェクト指向プログラミング言語の機能 は、次のとおりです。

Data Encapsulation: 

Data Abstraction: 

Polymorphism: 

Inheritance: 

これらの機能は、オブジェクト指向Rubyで議論されてきました。

オブジェクト指向プログラムには、クラスとオブジェクトが含まれます。クラスは個々のオブジェクトが作成される青写真の です。 オブジェクト指向の用語では、あなたの自転車は自転車として知られているオブジェクトのクラス のインスタンスであると言います。

車の例を挙げてください。それは、車輪、馬力、および 燃料またはガスタンク容量を含む。これらの特性は、クラスVehicleのデータメンバ を形成する。これらの特性の助けを借りて、1台の車を他の車と区別することができます( )。

車両には、停止、運転、 などの特定の機能があり、速度も向上します。これらの関数でも、クラス ビークルのデータメンバーが形成されます。したがって、クラスを の特性と関数の組み合わせとして定義することができます。

とハッシュ: "従業員" => "給与":

ハッシュは、このようなキーと値のペアのコレクションです。これは配列に似ていますが、インデックスは整数型インデックスではなく、 任意のオブジェクト型の任意のキーで行われます。

私はあなたにハッシュをお勧めします。

一方

は、コメントのオブジェクト表現でappers数を示したように、オブジェクトIDであるが、いくつかの操作を添加した:

1)ビット単位の左シフト:

5 << 1 # gives 10 

2)あなたは、このようなオブジェクトのハッシュ表現を取得することができますルビーでようやく

(10).to_s(16) 

"a" 

pry(main)> x = Person.new("Dan", "M") 
=> #<Person:0x00000003708098 @gender="M", @name="Dan"> 
[5] pry(main)> x.object_id 
=> 28852300 
[8] pry(main)> (x.object_id << 1).to_s(16) 
=> "3708098" 

をhexadeimalに渡さ:

x.instance_variables.each {|var| hash[var.to_s.delete("@")] = x.instance_variable_get(var) } 
1

オブジェクト→パットショーネシーによって優れた著書"Ruby under the microscope"からハッシュ

すべてのRubyのオブジェクトは、クラスポインタとインスタンス変数の配列 の組み合わせです。

Hereの幾分長い説明:

ユーザ定義のRubyオブジェクトが構造によって表されるが RObjectと呼ばれ、その値と呼ばれるポインタによって参照されます。

RObjectの内部には、RBasicと呼ばれる別の構造があります。これはすべて Rubyの値になります。

別にRBasic構造から、RObjectもnumiv、オブジェクトが持っているどのように多くのインスタンス変数のカウント 、ivptr、 ポインタでインスタンス変数の値の配列、及びiv_index_tbl、へのポインタを含みます各インスタンス変数の名前/同一性をivtpr配列内の の位置にマップする、オブジェクトに関連付けられたRClass 構造体に格納されたハッシュテーブルに渡します。あなたの例では

class Object 
    def instance_variables_hash 
    Hash[instance_variables.map { |name| [name, instance_variable_get(name)] } ] 
    end 
end 

:任意のRubyオブジェクトから

、それはextract a hash of instance variablesすることが可能です

x.instance_variables_hash 
=> {:@name=>"Dan", :@gender=>"M"} 

ハッシュ→オブジェクト?

しかし、重要な情報が欠落しているため、xをこのハッシュから戻すことはできませんでした。どのクラスがxのインスタンスですか?

"0x007f6f96600560".sub('0x','').to_i(16)/2 
#=> 70058620486320 

class Dog 
    def initialize(name, gender) 
    @name = name 
    @gender = gender 
    end 

    def bark 
    puts "WOOF" 
    end 
end 

person = Person.new("Dan", "M") 
dog = Dog.new("Dan", "M") 

p person.instance_variables_hash 
# {:@name=>"Dan", :@gender=>"M"} 
p dog.instance_variables_hash == person.instance_variables_hash 
# true 
person.bark 
# undefined method `bark' for #<Person:0x007fb3b20ed658 @name="Dan", @gender="M"> 

は、検査文字列のうち、OBJECT_IDを取得するには

をOBJECT_ID:

したがって、たとえば、あなたがxに送ることができる方法を知っているだろう

バック:

"0x" + (70058620486320 * 2).to_s(16).rjust(14,'0') 
#=> "0x007f6f96600560"