所以我对 Ruby 还是很陌生,还在学习习语。我仍然有很强的静态打字思维,所以也许一个问题是我打字过多。反正我的情况是这样的。
我有一个名为 Gene 的对象,带有 :name 和 :id。我有另一个称为基因型的对象,它维护着一个基因数组。
我想检查给定的基因型是否包含给定的基因。我希望能够通过 Genotype.has_gene?基因名称、基因 ID 或实际基因。在前一种情况下,例程将匹配名称或 id,以通过者为准。如果传递了完整的基因,则例程将坚持两个值都匹配。
我的逻辑是检查传递的值是否是 Integer,在这种情况下我假设它是一个 id;否则检查它是否是一个字符串并假设它是一个名称;否则检查它是否是一个基因;否则投诉和保释。
代码如下所示:
def has_gene?( gene )
if gene.is_a? Integer
id = gene
name = ""
elsif gene.is_a? String
id = nil
name = gene
elsif gene.is_a? Gene
id = gene.id
name = gene.name
else
raise "Can't intepret passed data as gene information"
end
name_valid = false
id_valid = false
@gene_specs.each do |current_gene_spec|
current_gene = current_gene_spec.gene
name_valid = name.empty? || name == current_gene.name
id_valid = id.nil? || id == current_gene.id
break if name_valid && id_valid
end
return name_valid && id_valid
end
这里感觉有些不对劲,但我无法确定。它似乎缺乏 Ruby 著名的简洁性:-)
想法?