我有以下資料結構
array_of_hashes = [{"key"=>"2020-10-01",
"foo"=>"100",
"bar"=>38,
"baz"=>19,
"losem"=>19,
"ipsum"=>0,
...},
...
]
state = {["", nil, nil, nil, nil]=>
#<MySimpleObject:0x0000557fb9fe4708
@foo=0.0,
@bar=0.0,
@baz=0.0,
@lorem=0.0,
@ipsum=0.0,
...}
array_of_hashes.each_with_object(state) do |stats, memo|
state = memo['key']
state.foo = stats['foo'].to_d
state.bar = stats['bar'].to_d
state.baz = stats['baz'].to_d
state.lorem = stats['lorem'].to_d
state.ipsum = stats['ipsum'].to_d
...
end
在這種情況下,我如何跟隨干燥?我需要在運行時生成和執行方法,例如:
query.each_with_object(shared_state) do |stats, memo|
state = memo['key']
columns = %w[foo bar baz lorem ipsum ...]
columns.each { |attribute|
define_method attribute do #??????
state.attribute = stats[attribute.to_s].to_d
end
}
end
據我所知,define_method 不適合這種情況。
uj5u.com熱心網友回復:
簡短的回答,不要!這將使您的代碼難以閱讀。在我看來,您在第一個示例中的內容非常好。并非所有東西都需要干燥。
如果你真的很想這樣做,你可以使用 send
query.each_with_object(shared_state) do |stats, memo|
state = memo['key']
columns = %w[foo bar baz lorem ipsum ...]
columns.each do |attribute|
state.send("#{attribute}=", stats[attribute].to_d)
end
end
https://apidock.com/ruby/Object/send
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325470.html
下一篇:約瑟夫斯問題的負數解
