그래서 Ruby를 처음 사용하고 숙어를 배우는 데는 상당히 익숙합니다. 나는 여전히 정적 인 타이핑 사고 방식을 가지고 있기 때문에, 한 가지 문제는 과도하게 타이핑한다는 것입니다. 어쨌든, 내 상황은 이것이야.Ruby 인수에서 여러 유형을 처리하기위한 "적절한"관용구
저는 Gene이라는 객체가 있습니다 : name과 : id. 유전자 배열을 유지 관리하는 Genotype이라는 또 다른 개체가 있습니다.
주어진 유전자형에 주어진 유전자가 포함되어 있는지 확인하고 싶습니다. Genotype.has_gene을 전달할 수 있습니까? 유전자 이름, 유전자 id 또는 실제 유전자. 전자의 경우, 루틴은 이름 OR ID 중 일치하는 것을 통과합니다. 전체 유전자가 전달되면 루틴은 두 값의 일치를 주장합니다.
내 논리는 전달 된 값이 Integer인지 확인하는 것이며,이 경우 전달 된 값이 ID라고 가정합니다. 그렇지 않으면 String인지 확인하고 이름이라고 가정합니다. 그렇지 않으면 유전자인지 확인하십시오. 다른 사람은 불평하고 보석합니다.
코드는 다음과 같습니다
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
뭔가 잘못 여기 느낌하지만 난 그것을 아래로 고정 할 수 없습니다. 루비의 유명한 간결함이 부족한 것처럼 보입니다 :-)
생각들?
찾고있는 것이'유전자 '인 경우 왜'문자열 '과'정수 '를 사용 하시겠습니까? 유형에 대한 테스트는 정말 나쁜 코드 냄새입니다. –
이런 종류의 일을하는 경우'Fixnum','String','Gene','Symbol','NilClass' 등의 메소드에 to_gene 메소드를 추가하면 옵션이 될 수 있습니다. 그러면 간단히'@ gene_specs.include? (gene.to_gene)'할 수 있습니다. 그것은 대답이 아닌 커다란 * *와 * * 일 수도 있습니다. –
글쎄, 진 (Gene)은 실제로 Integer와 String의 패키지입니다. 따라서 유효한 입력은 Integer, String 또는 Integer-and-String, 즉 Gene입니다. 그러나 관계없이, 나쁜 냄새에 대한 나의 인식은 게시물로 이어지는 것이 었습니다 :-) –