Ruby对象与哈希
下面的代码段返回一个对象Ruby对象与哈希,ruby,Ruby,下面的代码段返回一个对象 class Person def initialize(name, gender) @name = name @gender = gender end end x = Person.new("Dan", "M") => #<Person:0x007f6f96600560 @name="Dan", @gender="M"> 班级人员 def初始化(姓名、性别) @name=name @性别=性别 结束 结束 x=新的人(“Dan
class Person
def initialize(name, gender)
@name = name
@gender = gender
end
end
x = Person.new("Dan", "M")
=> #<Person:0x007f6f96600560 @name="Dan", @gender="M">
班级人员
def初始化(姓名、性别)
@name=name
@性别=性别
结束
结束
x=新的人(“Dan”、“M”)
=> #
- 对象
<…>代码>和散列
?为什么Ruby类不返回散列呢李>{…}
- 对象中的
是什么?我很确定它不是0x007f6f96600560
对象id
- 当然,有时您可以使用对象和散列来处理相同的事情。像这样存储键值对对象:
[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"}
这些特性已经在面向对象的Ruby中讨论过 面向对象程序包括类和对象。一个班级是 从中创建单个对象的蓝图。在里面 面向对象术语,我们说你的自行车是 一类被称为自行车的物体 以任何车辆为例。它由车轮、马力和发动机组成 燃料或燃气箱容量。这些特征构成了数据成员 该类车辆的。您可以将一辆车与另一辆车区分开来 借助于这些特征 车辆也可以具有某些功能,例如停车、驾驶、, 还有超速。甚至这些函数也构成了类的数据成员 车辆。因此,您可以将类定义为 特点和功能 和散列: 散列是这样的键值对的集合:“employee”=> “工资”。它类似于数组,只是索引是通过 任何对象类型的任意键,而不是整数索引 因此,对于存储数据,我建议您使用散列 另一方面,如注释所示,在对象表示中出现的数字是对象id,但添加的操作很少: 1) 按位左移:x.instance_variables.each {|var| hash[var.to_s.delete("@")] = x.instance_variable_get(var) }
对象→ 搞砸 来自帕特·肖内西的优秀著作: 每个Ruby对象都是一个类指针和一个数组的组合 实例变量的定义 这是一个较长的描述: 用户定义的Ruby对象由称为 RObject,并由名为VALUE的指针引用 在RObject内部,有另一个名为RBasic的结构,它 Ruby值将具有 除了RBasic结构之外,RObject还包含numiv,一个count 对象有多少个实例变量,ivptr,一个指向 实例变量的值数组和iv_index_tbl 指向存储在对象的关联RClass中的哈希表的指针 将每个实例变量的名称/标识映射到其 在ivtpr数组中的位置 从任何Ruby对象,都可以: 以你的例子:5 << 1 # gives 10
搞砸→ 对象 但是您不可能从这个散列中创建x.instance_variables_hash => {:@name=>"Dan", :@gender=>"M"}
,因为您缺少一个关键信息:什么类是x
的实例 例如,您不知道可以发送到x
的方法:x
返回: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">
"0x" + (70058620486320 * 2).to_s(16).rjust(14,'0') #=> "0x007f6f96600560"
is0x00…
(object_id OP似乎暗示所有类都应该从
散列
中进行子类化,实例变量名和值应该作为键值对存储在其中。事实上,JavaScript的工作原理有点类似。简短回答:因为Ruby不是。@EricDuminil谢谢!简明扼要。因此,它可以归结为选择吗关于设计?也就是说,基于原型的设计可以通过重用其现有哈希来为Ruby工作,就像Javascript如何重用现有对象作为原型一样,但Ruby最终采用了基于类的设计?
x.instance_variables_hash => {:@name=>"Dan", :@gender=>"M"}
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">
"0x007f6f96600560".sub('0x','').to_i(16)/2 #=> 70058620486320
"0x" + (70058620486320 * 2).to_s(16).rjust(14,'0') #=> "0x007f6f96600560"
- 对象中的