1

我有一个名为 的类,Product其中包含一个name和。pricecount

在另一个名为Shop(包括 class Product)的类中,我用一个空数组进行初始化。然后使用 方法添加product到这个数组中push

问题发生to_sShop类中的方法上:

def to_s
  string = "Products in the shop:\n"
  @list.each do |list|
    #### how can i get access to the attributes of product like @list.name or something like that ?  I have tried loads of different methods but i cant get access to my attributes. (the array doesnt recognize the product class)
    puts @list.name
  end

Product如果我在不使用的情况下创建 a Array,我可以访问属性 - 我猜问题出在Array...

4

3 回答 3

3

所以首先,你的块不匹配。

你要:

def to_s
  string = "Products in the shop:\n"
  @list.each do |item|
    string << item.name + "\n"     # not @list.name! @list is an Array. item is an element of your list.
  end
  string # you could also say: return string
end

您不想使用puts,因为这会将其发送到控制台 - 当您尝试将其存储在名为string. 你想确保你也把它归还。

您不必调用您的块参数item。您可以将其称为list,但这会令人困惑,因为您还有另一个名为 的变量@list,而 block 参数根本不是一个列表——只是数组中的一个项目。

请注意,这不是完成此操作的最有效方法。首选的方式是这样的:

def to_s
  products_list = @list.map do |item|
    item.name
  end
  "Products in the shop:\n" + products_list.join("\n")
end
于 2013-09-29T19:49:33.513 回答
2

中的每个元素@listeach作为list.

假设@list是一个带有Product对象的 Enumerable,您应该能够list.name获取块内的 name 属性。

于 2013-09-29T19:50:25.243 回答
1

我更喜欢andmap和(只是一个偏好)和大括号 ( )因为我喜欢通过使用大括号来暗示返回值很重要,并且有一个块用于副作用,例如joineach<<{}do enddo end

def to_s
  "Products in the shop:\n" << @list.map{|item| item.name}.join("\n")
end

我也不会使用puts,因为to_s应该返回一个字符串,而不是输出一个字符串。

于 2013-09-29T20:00:51.017 回答