gpt4 book ai didi

ruby - 空哈希作为默认参数变成数组?

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

默认为空散列的参数 attrs={} 返回错误:

can't convert Array into Hash
(TypeError)

我已经在 Ruby 版本 1.8.6、1.8.7 和 1.9.1 上尝试过这个。哈希值将传递给 attrs

class Category < Object   

attr_accessor :attributes
attr_accessor :rel_attrs
attr_accessor :cls_str

def initialize (term='',title='', attrs={}, scheme = '', rel=[], cls_str='')

@attributes ={}
@attributes['scheme'] = scheme
@attributes['term'] = term
@attributes['title'] = title
@attributes['related'] = rel
@cls_str = cls_str

if not attrs.empty?
@attributes.update attrs
end
end
end

我做错了什么?

最佳答案

一些注意事项:

  • 您不必从 Object 继承。
  • if not 可以更惯用地表示为 unless
  • attrs 哈希作为最后一个参数的优点是,您可以在调用 Category.new 时省略哈希元素周围的 {} >。如果散列位于中间,您可以执行此操作,因此向我们展示您对 Category.new 的调用是有意义的。

我相应地更改了您的代码:

class Category 

attr_accessor :attributes
attr_accessor :rel_attrs
attr_accessor :cls_str

def initialize (term='',title='', scheme = '', rel=[], cls_str='', attrs={})

@attributes ={}
@attributes['scheme'] = scheme
@attributes['term'] = term
@attributes['title'] = title
@attributes['related'] = rel
@cls_str = cls_str

@attributes.update(attrs) unless attrs.empty?
end
end

你可以这样调用它:

>> c = Category.new("term", "title", "scheme", [1,2,3], 'cls_string', :foo => 'bar', :baz => 'qux') 
#=> #<Category:0x00000100b7bff0 @attributes={"scheme"=>"scheme", "term"=>"term", "title"=>"title", "related"=>[1, 2, 3], :foo=>"bar", :baz=>"qux"}, cls_str"cls_string"
>> c.attributes
#=> {"scheme"=>"scheme", "term"=>"term", "title"=>"title", "related"=>[1, 2, 3], :foo=>"bar", :baz=>"qux"}

这显然有一个问题,即必须指定所有其他可选参数才能指定 attrs。如果您不想这样做,请将 attrs 移回参数列表的中间,并确保在调用中包含 {}。或者甚至更好,使整个参数列表成为一个散列并将其与默认参数合并。有点像

 class Category(opts = {})
# stuff skipped
@options = { :bla => 'foo', :bar => 'baz'}.merge(opts)
# more stuff skipped
end

关于ruby - 空哈希作为默认参数变成数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713461/

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