Ruby类初始化传哈希:重复输入键的简化方法咨询
解决Ruby类重复输入哈希键的几种方法
你可以通过以下几种方式避免重复输入相同的哈希键:
1. 定义默认哈希模板,用merge覆盖值
先定义一个包含所有固定键的默认哈希,初始化时只传入需要修改的键值对,通过merge方法合并默认模板和传入的参数,保证所有实例的键一致:
# 定义包含所有固定键的默认模板 DEFAULT_HASH = { k1: nil, k2: nil, k3: nil } class MyClass attr_accessor :my_hash def initialize(attrs = {}) # 合并默认模板和传入的参数,传入的值会覆盖默认值 @my_hash = DEFAULT_HASH.merge(attrs) end end # 创建实例时只需传入需要修改的键值对 instance1 = MyClass.new(k1: "v1", k2: "v2", k3: "v3") instance2 = MyClass.new(k1: "v4", k3: "v6") # 未传入的k2使用默认值nil
2. 使用关键字参数替代哈希
把哈希的键直接转为类的实例属性,用Ruby的关键字参数初始化,既直观又不用重复写哈希结构:
class MyClass attr_accessor :k1, :k2, :k3 # 给关键字参数设置默认值,保证属性始终存在 def initialize(k1: nil, k2: nil, k3: nil) @k1 = k1 @k2 = k2 @k3 = k3 end # 如果仍需要my_hash属性,可添加方法返回对应哈希 def my_hash { k1: @k1, k2: @k2, k3: @k3 } end end # 创建实例时按名传参,无需写全所有参数 instance1 = MyClass.new(k1: "v1", k2: "v2", k3: "v3") instance2 = MyClass.new(k2: "v5")
3. 批量创建实例时用数组存储参数
如果需要创建大量实例,可以把每个实例的参数存在数组中,通过循环批量创建:
DEFAULT_HASH = { k1: nil, k2: nil, k3: nil } class MyClass attr_accessor :my_hash def initialize(attrs = {}) @my_hash = DEFAULT_HASH.merge(attrs) end end # 把所有实例的参数存入数组 instance_params = [ { k1: "v1", k2: "v2", k3: "v3" }, { k1: "v4", k2: "v5", k3: "v6" }, { k2: "v7" } ] # 批量生成实例 instances = instance_params.map { |params| MyClass.new(params) }
内容的提问来源于stack exchange,提问作者plshelpme
相关产品推荐
相关产品推荐

