답변:
당신이 찾고있는 방법은 instance_variable_set
입니다. 그래서:
hash.each { |name, value| instance_variable_set(name, value) }
또는 더 간단히
hash.each &method(:instance_variable_set)
인스턴스 변수 이름에 "@"가 누락 된 경우 (OP의 예에서와 같이) 추가해야하므로 다음과 비슷합니다.
hash.each { |name, value| instance_variable_set("@#{name}", value) }
hash.each &method(:instance_variable_set)
에서 메서드 instance_variable_set
가 필요한 두 개의 매개 변수를받는 방법을 설명해 주 시겠습니까?
h = { :foo => 'bar', :baz => 'qux' }
o = Struct.new(*h.keys).new(*h.values)
o.baz
=> "qux"
o.foo
=> "bar"
.new()
하고 있습니까?
Struct.new
해시 키를 기반으로 새 클래스를 만든 다음 두 번째 new
는 방금 만든 클래스의 첫 번째 개체를 만들어 Hash 값으로 초기화합니다. 참조 ruby-doc.org/core-1.8.7/classes/Struct.html
require 'ostruct'; h = {:foo => 'foo'}; o = OpenStruct.new(h); o.foo == 'foo'
Struct.new(*hash.keys.map { |str| str.to_sym }).new(*hash.values)
set_entity
모든 컨트롤러에 대한 일반 콜백을 원하고 기존 인스턴스 변수를 방해하고 싶지 않을 수 있습니다def set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
send
사용자가 존재하지 않는 인스턴스 변수를 설정하지 못하도록하는 방법 을 사용할 수도 있습니다 .
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
send
클래스에 attr_accessor
인스턴스 변수 와 같은 setter가있을 때 사용하십시오 .
class Example
attr_accessor :foo, :baz
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
end
hash.each {|k,v| instance_variable_set("@#{k}",v)}