gpt4 book ai didi

ruby-on-rails - ruby 对象数组...或散列

转载 作者:数据小太阳 更新时间:2023-10-29 08:21:45 25 4
gpt4 key购买 nike

我现在有一个对象:

class Items
attr_accessor :item_id, :name, :description, :rating

def initialize(options = {})
options.each {
|k,v|
self.send( "#{k.to_s}=".intern, v)
}
end

end

我将它作为单个对象分配到数组中...

@result = []

some loop>>
@result << Items.new(options[:name] => 'name', options[:description] => 'blah')
end loop>>

但不是将我的单一对象分配给一个数组...我怎样才能使对象本身成为一个集合?

基本上想要以这样的方式拥有对象,以便我可以定义方法,例如

def self.names
@items.each do |item|
item.name
end
end

我希望这是有道理的,可能我忽略了一些宏伟的计划,这将使我的生活在 2 行中无限轻松。

最佳答案

在我发布一个如何返工的例子之前的一些观察。

  • 在声明新对象时,为类赋予复数名称可能会导致很多语义问题,因为在这种情况下,您会调用 Items.new,这意味着您正在创建多个项目,而实际上实际上是在创建一个项目。对单个实体使用单数形式。
  • 调用任意方法时要小心,因为任何未命中都会引发异常。要么检查你是否可以先给他们打电话,要么在适用的情况下从不可避免的灾难中解救出来。

解决您的问题的一种方法是专门为 Item 对象创建一个自定义集合类,它可以为您提供所需的名称等信息。例如:

class Item
attr_accessor :item_id, :name, :description, :rating

def initialize(options = { })
options.each do |k,v|
method = :"#{k}="

# Check that the method call is valid before making it
if (respond_to?(method))
self.send(method, v)
else
# If not, produce a meaningful error
raise "Unknown attribute #{k}"
end
end
end
end

class ItemsCollection < Array
# This collection does everything an Array does, plus
# you can add utility methods like names.

def names
collect do |i|
i.name
end
end
end

# Example

# Create a custom collection
items = ItemsCollection.new

# Build a few basic examples
[
{
:item_id => 1,
:name => 'Fastball',
:description => 'Faster than a slowball',
:rating => 2
},
{
:item_id => 2,
:name => 'Jack of Nines',
:description => 'Hypothetical playing card',
:rating => 3
},
{
:item_id => 3,
:name => 'Ruby Book',
:description => 'A book made entirely of precious gems',
:rating => 1
}
].each do |example|
items << Item.new(example)
end

puts items.names.join(', ')
# => Fastball, Jack of Nines, Ruby Book

关于ruby-on-rails - ruby 对象数组...或散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com