我想写类似的东西:
class Test
def initialize(a,b,c)
end
def print()
puts @a
puts @b
puts @c
end
end
Test.new({a=>1, b=>2, c=>3}).print()
=>1
=>2
=>3
有没有办法实例化对象并使用哈希表映射其参数?
提前致谢。
答案 0 :(得分:4)
class Test
def initialize(options)
options.each do |key, value|
instance_variable_set("@#{key}", value)
end
end
def print
puts @a
puts @b
puts @c
end
end
Test.new(:a => 1, :b => 2, :c => 3).print
或使用OpenStruct
:
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html
这是一个简单的例子:
require 'ostruct'
puts OpenStruct.new(:a => 1, :b => 2, :c => 3).inspect
# Outputs: "#<OpenStruct a=1, b=2, c=3>"
答案 1 :(得分:4)
如果您仍在使用Ruby 1.9.3,则可以非常轻松地使用Hash对象:
class Test
attr_accessor :a, :b, :c
def initialize(h)
h.each {|k,v| send("#{k}=",v)}
end
def print()
puts @a
puts @b
puts @c
end
end
Test.new( {:a => 1, :b => 2, :c => 3}).print()
# 1
# 2
# 3
# => nil
请注意,它会创建一个名为“密钥”的变量,如果与a
,b
或c
不匹配,则访问者将失败。
答案 2 :(得分:3)
在当前版本的Ruby中,您可以使用关键字参数:
def initialize(a: nil, b: nil, c: nil)
@a, @b, @c = a, b, c
end
请注意,目前,关键字参数始终具有默认值,因此始终是可选的。如果你想强制使用关键字参数,你可以使用默认值任何 Ruby表达式的简单技巧:
def mand(name) raise ArgumentError, "#{name} is mandatory!" end
def initialize(a: mand 'a', b: mand 'b', c: mand 'c')
@a, @b, @c = a, b, c
end
在Ruby的下一个版本中,可以通过省略默认值来使用强制关键字参数:
def initialize(a:, b:, c:)
@a, @b, @c = a, b, c
end
见这里:
class Test
def initialize(a:, b:, c:)
@a, @b, @c = a, b, c
end
def to_s
instance_variables.map {|v| "#{v} = #{instance_variable_get(v)}" }.join("\n")
end
end
puts Test.new(a: 1, b: 2, c: 3)
# @a = 1
# @b = 2
# @c = 3