Ruby如果条件查看数组的所有内容

时间:2011-07-27 15:01:40

标签: ruby arrays conditional ruby-1.9

基本上我正在尝试编写一个if条件来查看数组的所有内容以判断该条件是否为真。

基本上,我想这样做:

SubScale.all.each do |ss|
  if ss.key IN(scales)
    execute this code
  end
end

如果ss.key是该数组中的任何条目,则数组中的比例并且我希望执行代码。

4 个答案:

答案 0 :(得分:5)

您正在寻找Array#include? :

scales.include?(ss.key)

答案 1 :(得分:4)

Array#include?更通用 - 需要您按值检查 - Enumerable#any?

SubScale.all.each do |ss|
  # Run the code if the value is an exact match
  run_code if scales.include?(ss.key)
end

SubScale.all.each do |ss|
  # Run the code if the block returns a truthy value
  run_code if scales.any?{ |scale| scale.downcase == ss.key.downcase }
end

最后,如果它是你想要的完全匹配,速度结果是一个问题(配置文件优先!),你可以通过使用哈希在O(1)中查找你的密钥来代替O(n)时间:

scale_lookup = Hash[ scales.map{ |s| [s,true] } ]
SubScale.all.each do |ss|
  run_code if scale_lookup[ss.key]
end

答案 2 :(得分:1)

scales.include?(ss.key)就是你所需要的。

答案 3 :(得分:0)

如果scales有很多元素,那么SubScale.all我会建议创建临时集(或哈希):

require "set"

scales_set = Set.new(scales)

....each do |ss|
  if scales_set.include?(ss.key)
    ...
  end
end

这可能会更快。

P.S。哈希似乎比set更快:

scales_hash = scales.inject({}) { |h, e| h[e] = true; h }

....each do |ss|
  if scales_hash.has_key?(ss.key)
    ...
  end
end