这个属性如何在ruby类中保存多个属性?

时间:2017-04-06 20:45:06

标签: ruby class attributes initialization ruby-hash

在这里,您看到我们有一个名为"属性"我们在课堂上初始化它,所以问题是名称和衬衫属性来自哪里,因为我们没有在课堂上初始化和定义它们?

class Shirt 
  attr_accessor :attribute
  def initialize(attributes)
    @attributes = attributes
  end
end

store = Shirt.new(name: "go", size: "42")

当我检查这个衬衫类的实例时,我得到一个哈希:

@attributes={:name=>"go", :size=>"42"}

任何人都可以帮忙解释一下吗?

3 个答案:

答案 0 :(得分:1)

在Ruby中,如果正确定义,最后一个参数会自动解释为哈希,并允许您在没有{}的情况下传递它。由于只有一个参数,它也被认为是最后一个参数:

store = Shirt.new(name: "go", size: "42")
#=> #<Shirt:0x000000022275c0 @attribute={:name=>"go", :size=>"42"}>

与:

相同
store = Shirt.new({name: "go", size: "42"})
#=> #<Shirt:0x000000022271d8 @attribute={:name=>"go", :size=>"42"}>

答案 1 :(得分:0)

@attributes={:name=>"go", :size=>"42"}

这一行告诉你的是你有一个名为@attributes的实例变量,它的值是一个哈希值,{:name=>"go", :size=>"42"}

用两个简单的变量来区分

class A
  def initialize(dogs, cats)
    @dogs = dogs
    @cats = cats
  end
end

A.new(4, 5)
 => #<A:0x007f96830e3c80 @dogs=4, @cats=5> 

答案 2 :(得分:0)

指令attr_accessor :attribute定义了2个方法

def attribute; @attribute;end

def attribute=(value); @attribute=value;end

但是当你打字的时候 store = Shirt.new(name: "go", size: "42")您定义了一个哈希并将其传递给属性 s param:

init_values={name: "go", size: "42"}
store = Shirt.new(init_values)

在initialize方法中,attributes param被视为哈希并传递给@attribute s 实例变量

尝试检查

store = Shirt.new(["go","42"])
store = Shirt.new({})

PS。

尝试使用attr_accessor :attributes,然后您就可以使用

store.attributes
store.attributes=