使用单数或复数从哈希中获取
Fetch from hash with either Singular or Plural
我在我的 ruby 代码中得到以下输入散列
my_hash = { include: 'a,b,c' }
(或)
my_hash = { includes: 'a,b,c' }
现在我想要最快的方式'a,b,c'
我目前使用
def my_includes
my_hash[:include] || my_hash[:includes]
end
但这非常慢,因为它总是首先检查 :include 关键字,如果失败,它会寻找 :includes。我多次调用这个函数,这个散列中的值可以不断变化。有什么办法可以优化和加速吗?我不会得到任何其他关键字。我只需要支持 :include 和 :includes.
您可以使用修改后的散列,该散列的键 :include
和 :includes
具有相同的值:
my_hash = { include: 'a,b,c' }
my_hash.update(my_hash.key?(:include) ? { includes: my_hash[:include] } :
{ include: my_hash[:includes] })
#=> {:include=>"a,b,c", :includes=>"a,b,c"}
如果您对多个操作使用相同的散列 my_hash
,这可能是最快的。但是,如果在几次询问后生成了一个新的散列,您可能会看到在构造散列时是否可以同时包含键 :include
和 :includes
。
注意事项和注意事项
首先,一些注意事项:
- 您标记了这个 Rails 3,所以您可能使用的是非常旧的 Ruby,它不支持许多优化,较新的 Hash-related 方法调用,例如 #fetch_values or #transform_keys!, or pattern matching 用于结构化数据。
- 你可以用你的哈希查找做各种各样的事情,但是 none 假设你可以确定只有一个键或另一个一直。
- 您没有显示任何调用代码,因此如果没有基准测试,很难看出这个操作在任何一般意义上如何被视为“慢”。
- 如果您正在使用 Rails 而不是寻找纯粹的 Ruby 解决方案,您可能需要考虑 ActiveModel::Dirty 仅在属性发生更改时才采取行动。
使用记忆
尽管如此,您在这里可能缺少的是某种形式的记忆,因此您无需每次都通过任何让您感觉缓慢的循环不断 re-evaluate 键并提取值.例如,您可以存储哈希评估的结果,直到需要刷新为止:
attr_accessor :includes
def extract_includes(hash)
@includes = hash[:include] || hash[:includes]
end
然后您可以从范围内的任何地方调用 #includes
或 #includes=
(或者如果您愿意,可以直接使用 @includes 实例变量)您喜欢而不必 re-evaluate 散列或键。例如:
def count_includes
@includes.split(?,).count
end
500.times { count_includes }
棘手的部分基本上是知道是否以及何时更新您的记忆值。基本上,当您从某个地方(如 ActiveRecord 或远程 API 获取新哈希时,您应该只调用 #extract_includes。在此之前,您可以重复使用存储的值,只要它仍然有效。
我在我的 ruby 代码中得到以下输入散列
my_hash = { include: 'a,b,c' }
(或)
my_hash = { includes: 'a,b,c' }
现在我想要最快的方式'a,b,c'
我目前使用
def my_includes
my_hash[:include] || my_hash[:includes]
end
但这非常慢,因为它总是首先检查 :include 关键字,如果失败,它会寻找 :includes。我多次调用这个函数,这个散列中的值可以不断变化。有什么办法可以优化和加速吗?我不会得到任何其他关键字。我只需要支持 :include 和 :includes.
您可以使用修改后的散列,该散列的键 :include
和 :includes
具有相同的值:
my_hash = { include: 'a,b,c' }
my_hash.update(my_hash.key?(:include) ? { includes: my_hash[:include] } :
{ include: my_hash[:includes] })
#=> {:include=>"a,b,c", :includes=>"a,b,c"}
如果您对多个操作使用相同的散列 my_hash
,这可能是最快的。但是,如果在几次询问后生成了一个新的散列,您可能会看到在构造散列时是否可以同时包含键 :include
和 :includes
。
注意事项和注意事项
首先,一些注意事项:
- 您标记了这个 Rails 3,所以您可能使用的是非常旧的 Ruby,它不支持许多优化,较新的 Hash-related 方法调用,例如 #fetch_values or #transform_keys!, or pattern matching 用于结构化数据。
- 你可以用你的哈希查找做各种各样的事情,但是 none 假设你可以确定只有一个键或另一个一直。
- 您没有显示任何调用代码,因此如果没有基准测试,很难看出这个操作在任何一般意义上如何被视为“慢”。
- 如果您正在使用 Rails 而不是寻找纯粹的 Ruby 解决方案,您可能需要考虑 ActiveModel::Dirty 仅在属性发生更改时才采取行动。
使用记忆
尽管如此,您在这里可能缺少的是某种形式的记忆,因此您无需每次都通过任何让您感觉缓慢的循环不断 re-evaluate 键并提取值.例如,您可以存储哈希评估的结果,直到需要刷新为止:
attr_accessor :includes
def extract_includes(hash)
@includes = hash[:include] || hash[:includes]
end
然后您可以从范围内的任何地方调用 #includes
或 #includes=
(或者如果您愿意,可以直接使用 @includes 实例变量)您喜欢而不必 re-evaluate 散列或键。例如:
def count_includes
@includes.split(?,).count
end
500.times { count_includes }
棘手的部分基本上是知道是否以及何时更新您的记忆值。基本上,当您从某个地方(如 ActiveRecord 或远程 API 获取新哈希时,您应该只调用 #extract_includes。在此之前,您可以重复使用存储的值,只要它仍然有效。