如果我有这门课:

class A
  attr_accessor :b,:c,:d
end

这个代码:

a = A.new
h = {"b"=>10,"c"=>20,"d"=>30}

是否可以直接从散列中初始化对象,而不需要我判断每一对并调用instance_variable_set?比如:

a = A.new(h)

这将导致每个实例变量被初始化为哈希中具有相同名称的变量.

推荐答案

可以在类上定义初始化函数:

class A
  attr_accessor :b,:c,:d
  def initialize(h)
    h.each {|k,v| public_send("#{k}=",v)}
  end
end

或者你可以创建一个模块,然后"将其混合"

module HashConstructed
 def initialize(h)
  h.each {|k,v| public_send("#{k}=",v)}
 end
end

class Foo
 include HashConstructed
 attr_accessor :foo, :bar
end

或者你可以试试constructor美元

Ruby相关问答推荐

如何在将拆分元素保留为空字符串的同时拆分字符串?

Ruby:如何在 vanilla ruby​​ 中使用有效支持日期?

Ruby:一个方法可以返回不同类型的对象吗?

这是一个很好的测试?规范

数组切片中没有左边框的Ruby范围

将数组转换 for each 元素的嵌套哈希

如何使用正则表达式在字符串中查找特定匹配项

如何使用 capybara + cucumber 断言 ruby​​ 中的 html 表行数

为什么 Ruby 中的 `a = a` `nil`?

退出(exit)和中止(abort)有什么区别?

如何在不按 Enter 的情况下获取单个字符?

Ruby 的排序方法使用哪种算法?

如何在 Ruby 中解冻对象?

如何通过拆分字符的最后一次出现将字符串拆分为仅两部分?

比较两个数组忽略Ruby中的元素顺序

计算文件中的行数而不将整个文件读入内存?

判断散列的键是否包含所有键集

Ruby 中的=~运算符是什么?

Ruby 将 CSV 文件读取为 UTF-8 和/或将 ASCII-8Bit 编码转换为 UTF-8

Ruby 中的自然语言处理