Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby对象与哈希_Ruby - Fatal编程技术网

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"}
      
      x.instance_variables.each {|var| hash[var.to_s.delete("@")] = x.instance_variable_get(var) }
      
      这些特性已经在面向对象的Ruby中讨论过

      面向对象程序包括类和对象。一个班级是 从中创建单个对象的蓝图。在里面 面向对象术语,我们说你的自行车是 一类被称为自行车的物体

      以任何车辆为例。它由车轮、马力和发动机组成 燃料或燃气箱容量。这些特征构成了数据成员 该类车辆的。您可以将一辆车与另一辆车区分开来 借助于这些特征

      车辆也可以具有某些功能,例如停车、驾驶、, 还有超速。甚至这些函数也构成了类的数据成员 车辆。因此,您可以将类定义为 特点和功能

      和散列:

      散列是这样的键值对的集合:“employee”=> “工资”。它类似于数组,只是索引是通过 任何对象类型的任意键,而不是整数索引

      因此,对于存储数据,我建议您使用散列

      另一方面,如注释所示,在对象表示中出现的数字是对象id,但添加的操作很少:

      1) 按位左移:

      5 << 1  # gives 10
      
      对象→ 搞砸 来自帕特·肖内西的优秀著作:

      每个Ruby对象都是一个类指针和一个数组的组合 实例变量的定义

      这是一个较长的描述:

      用户定义的Ruby对象由称为 RObject,并由名为VALUE的指针引用

      在RObject内部,有另一个名为RBasic的结构,它 Ruby值将具有

      除了RBasic结构之外,RObject还包含numiv,一个count 对象有多少个实例变量,ivptr,一个指向 实例变量的值数组和iv_index_tbl 指向存储在对象的关联RClass中的哈希表的指针 将每个实例变量的名称/标识映射到其 在ivtpr数组中的位置

      从任何Ruby对象,都可以:

      以你的例子:

      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"
      

      0x00…
      is
      (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"