Я пытаюсь реализовать класс, который использует ha sh в качестве конструктора как часть моего 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
И тест, который не прошел мой метод initialize
, таков:
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