通常、Ruby では以下を使用してこれを行います。
self.first ||= first_parsed
self.middle ||= middle_parsed
self.last ||= last_parsed
self.title ||= title_parsed
self.suffix ||= suffix_parsed
もう少し動的に行う場合は、次のようにします。
class SomeClass
def initialize(first_name=nil, middle_name=nil, last_name=nil, title=nil, suffix=nil)
@first_name, @middle_name, @last_name, @title, @suffix = first_name, middle_name, last_name, title, suffix
end
def update(first_parsed, middle_parsed, last_parsed, title_parsed, suffix_parsed)
{
:first_name => first_parsed,
:middle_name => middle_parsed,
:last_name => last_parsed,
:title => title_parsed,
:suffix => suffix_parsed
}.each{ |k, v|
instance_var = "@#{ k }"
self.instance_variable_set(instance_var, v) unless self.instance_variable_get(instance_var)
}
end
end
それを使用して:
some_class_instance = SomeClass.new('foo', 'bar')
some_class_instance
# => #<SomeClass:0x007fcb030941a8
# @first_name="foo",
# @last_name=nil,
# @middle_name="bar",
# @suffix=nil,
# @title=nil>
some_class_instance.update(
*%w[
new_first
new_middle
new_last
new_title
new_suffix
]
)
some_class_instance
# => #<SomeClass:0x007fcb030941a8
# @first_name="foo",
# @last_name="new_last",
# @middle_name="bar",
# @suffix="new_suffix",
# @title="new_title">
私は、ある種の視覚的なマッピングを使用することを好みます。これが、変数へのシンボルのハッシュが存在する理由です。文字列解析を使用してより動的に行うことは可能ですが、アルゴリズムの一部が台無しになっていて、ループ内で印刷することによってのみ知ることができる場合、メンテナンスの問題が発生する可能性があります。このようなテーブルを使用すると、特定の kev/value 関係を簡単に検索できます。
問題は、これを動的に行うためのコードを生成するまでに、単純な||=
ベース ブロックを既に作成して、先に進んでいる可能性があることです。デバッグ時間が短縮され、何が何に影響するかが非常に明確になり、保守性が向上します。ですから、よりダイナミックであることで実際に長期的に有用なものが得られるかどうかはわかりません。これは、コードを記述するときによく行うトレードオフの 1 つです。