Ruby应该允许分配配置参数

Ruby应该允许分配配置参数,ruby,Ruby,作为Ruby学习的一部分,我正在尝试实现一个将哈希作为构造函数的类 这就是我到目前为止所做的: class Example attr_accessor :bar, :baz, :some def initialize args args.each do |k,v| instance_variable_set("@#{k}", v) unless v.nil? end end my_hash = Example.new(foo: {bar:

作为Ruby学习的一部分,我正在尝试实现一个将哈希作为构造函数的类

这就是我到目前为止所做的:

class Example

  attr_accessor :bar, :baz, :some

  def initialize args
     args.each do |k,v|
       instance_variable_set("@#{k}", v) unless v.nil?
     end
  end


  my_hash = Example.new(foo: {bar: "x", "baz" => "y"}, "some" => "other")

end
应按照如下方式读取上述值:

my_hash.foo.bar
=> "x"
my_hash.foo.baz
=> "y"
my_hash.some
=> "other"
my_hash.foo.class
=> Example
my_hash.unknown
=> nil
并覆盖这些值并指定新值。然而,在我实现了这一点之后,这里的代码片段是:

def initialize args
         args.each do |k,v|
           instance_variable_set("@#{k}", v) unless v.nil?
         end
      end
因为它不允许分配参数,所以不好吗?不知道那是什么意思

这是我没有通过的测试之一

it 'should store my_hash from hash passed through constructor' do
    my_hash = Example.new({p1: 'test', 'p2' => {'p3' => [10, 12]}, p4: {}})

    expect(my_hash.p1).to eq('test')
    expect(my_hash.p2.p3).to eq([10, 12])
    expect(my_hash.p2).to be_a(Example)
  end
我的
初始化
方法失败的测试是:

it 'should allow assigning config params' do
    my_hash = Example.new

    my_hash.some = 'test'
    my_hash.other = 'test2'
    my_hash.yet_one_more = {}
    my_hash.yet_one_more.test = 'test'

    expect(my_hash.some).to eq('test')
    expect(my_hash.other).to eq('test2')
    expect(my_hash.yet_one_more.test).to eq('test')
  end

在您的示例中,您将向
initialize
方法传递一个散列,然后为每个键值对迭代一个新的实例变量。考虑到这一点,您正在创建的唯一实例变量是:

@foo={bar:“x”,“baz”=>“y”}
@some='other'
因此,您只需要上述变量的属性访问器

#这允许您访问“foo”和“some”所持有的任何内容,
#包括嵌套属性。
属性访问器:foo,:some
哦,您得到了一个错误,因为您试图在类内创建一个变量my_hash(您试图在其自身定义内实例化一个类)。这是您将如何定义它的:

类示例
属性访问器:foo,:some
def初始化参数
各参数均为| k,v|
实例变量集(“@#{k}”,v),除非v.nil?
结束
结束
结束
my_hash=Example.new(foo:{bar:“x”,“baz”=>“y”},“some”=>“other”)
#您可以访问和修改的@foo实例变量
把我的_hash.foo
#已定义为符号的@foo的bar属性
放入我的_hash.foo[:bar]
#定义为字符串的@foo的baz属性
将我的_hash.foo[“baz”]
#您的@some实例变量
把我的杂烩放一些
#请注意,尽管“foo”被定义为符号,“some”被定义为符号
#字符串,访问器允许您使用
#点符号。
编辑:根据您添加的测试,我猜如果传递的参数是嵌套散列,他们希望您创建一个新实例。如果是这样,您可以这样做:

类示例
def初始化参数
各参数均为| k,v|
#如果值是散列,则创建一个新的示例实例
v=self.class.new(v)如果v.class==Hash
实例变量集(“@#{k}”,v),除非v.nil?
#为每个属性动态设置访问器。
self.class.\uuuuu发送\uuuuuu(:attr\u访问器,k)
结束
结束
结束

谢谢你的回答,但我改变了我的问题,我意识到我真正想问的是我的
初始化
方法有什么问题,它应该允许分配配置参数,但我不清楚这是什么样子。我甚至需要
initialize
方法吗?您的
initialize
方法正在按预期工作。您的问题是类中定义的
my_hash
变量。是的,我已尝试在
irb
中对其进行测试,但无法获得预期的结果。如何获取我的\u hash.foo.bar
以返回“x”
?练习中说我不能使用“ostruct”,ruby不支持点表示法。我编辑了我的答案,给你一个更清晰的例子。让我知道这是否适用于您。我不确定教程中会问什么,但我猜他们希望您在每次找到哈希值时创建一个新的示例实例。我加了一些可能对你有帮助的东西。