Я включил мое лучшее представление вашего вопроса в код в нижней части моего ответа, но я хотел бы представить свое решение, поскольку я сначала понимаю вашу дилемму ...
Сделайте это, если ваш атрибут name
предназначен для публичного доступа:
class Person
attr_accessor :name
def initialize(name)
@name = name
end
def interpret(text_to_parse)
# I have no idea what you are parsing in real life
self.name = text_to_parse.split.last
end
end
person = Person.new("Frederick")
puts person.name
# => "Frederick"
person.interpret("Please, call me Fred")
puts person.name
# => "Fred"
Сделайте это, если ваш атрибут name
не должен быть (легко) общедоступным: (Для чего бы это ни стоило, в Ruby так или иначе можно получить доступ ко всему. Одна из многих вещей, которые делают его потрясающим!)
class Person
def initialize(name)
@name = name
end
def interpret(text_to_parse)
# I have no idea what you are parsing in real life
@name = text_to_parse.split.last
end
end
person = Person.new("Frederick")
puts person.instance_variable_get("@name")
# => "Frederick"
person.interpret("Please, call me Fred")
puts person.instance_variable_get("@name")
# => "Fred"
И, как уже упоминалось выше, вот мой лучший перевод вашего вопроса в код:
class Person
def initialize
@person_summary_info = { name: "foo" }
@name = "bar"
@dob = "baz"
@favorite_food = "beer"
end
def interpret(text_to_parse)
# Some kind of parsing?
get_name_1
# OR
get_name_2(@person_summary_info)
# OR
get_name_3
# OR
@name = get_name_4
end
private
def get_name_1
@person_summary_info[:name]
end
def get_name_2(person_summary_info)
person_summary_info[:name]
end
def get_name_3
@name = 'John'
end
def get_name_4
'John'
end
end
Надеюсь, вы можете понять, почему в комментариях возникает путаница относительно того, что именно вы спрашиваете. Если ничего другого, возможно, это поможет вам сформулировать ваш вопрос более четко, чтобы мы могли помочь!
Наконец, вам следует избегать написания собственных методов получения / установки в Ruby, если только вам не нужно подключать некоторый пользовательский код к процессам получения / установки - используйте макросы уровня класса attr_reader
/ attr_writer
/ attr_accessor
создать их для вас.