1

如您所见,我们有一个名为“attributes”的属性,我们在类中对其进行了初始化,所以问题是名称和衬衫属性从何而来,因为我们没有在类中初始化和定义它们?

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

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

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

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

谁能帮忙解释一下?

4

3 回答 3

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"}>
于 2017-04-06T21:08:16.637 回答
0

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

def attribute; @attribute;end

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

但是当您键入时, store = Shirt.new(name: "go", size: "42")您将定义一个哈希并将其传递给属性参数:

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

在初始化方法中,attributesparam 被视为一个 Hash 并传递给 @attribute实例变量

尝试检查

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

附言。

试试看,attr_accessor :attributes然后你就可以使用了

store.attributes
store.attributes=
于 2017-04-06T20:59:51.177 回答
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> 
于 2017-04-06T20:56:32.577 回答