所以我正在做一个小任务,把DNA链转录成RNA链。我的当前代码如下:
class Complement
def self.of_dna(str)
dna_rna = { 'G' => 'C', 'C' => 'G', 'T' => 'A', 'A' => 'U' }
rna = []
str.scan(/[GCTA]/).each do |x|
rna << dna_rna[x]
end
rna.join('')
end
end它工作得很完美,除了在一种情况下。如果一条DNA链是部分正确的,例如,ACGTXXXCTTAA,我的方法会将DNA翻译成RNA,而忽略X,给出UGCAGAAUU而不是""的结果。我怎样才能使循环在接收到与DNA无关的字母时失败并退出呢?
编辑:我试图通过的测试如下所示:
def test_dna_correctly_handles_partially_invalid_input
# skip
assert_equal '', Complement.of_dna('ACGTXXXCTTAA')
end我从下面尝试了@Holger的想法,并收到了以下错误:
1) Error:
ComplementTest#test_dna_correctly_handles_completely_invalid_input:
ArgumentError: ArgumentError
/Users/LukasBarry/exercism/ruby/rna-transcription/rna_transcription.rb:6:in `block in of_dna'
/Users/LukasBarry/exercism/ruby/rna-transcription/rna_transcription.rb:5:in `each'
/Users/LukasBarry/exercism/ruby/rna-transcription/rna_transcription.rb:5:in `of_dna'
rna_transcription_test.rb:43:in `test_dna_correctly_handles_completely_invalid_input'我从上述方法中得到的通常失败是:
1) Failure:
ComplementTest#test_dna_correctly_handles_partially_invalid_input [rna_transcription_test.rb:48]:
Expected: ""
Actual: "UGCAGAAUU"任何帮助都将不胜感激。
发布于 2017-01-06 20:00:26
尝尝这个
class Complement
def self.of_dna(str)
return "" if str =~ /[^GCTA]/
...
end
end有趣的是,你甚至不需要一个循环来替换字符
str = 'GATTACA'
str.tr('ATCG', 'UAGC')
# => 'CUAAUGU'这就是你所需要的。
发布于 2017-01-06 19:52:29
您还可以在regex中匹配X,如果在字符串中找到erorr处理,则执行一些erorr处理。这可能是这样的:
class Complement
def self.of_dna(str)
dna_rna = { 'G' => 'C', 'C' => 'G', 'T' => 'A', 'A' => 'U' }
rna = []
str.scan(/[GCTAX]/).each do |x|
return '' if x == 'X'
rna << dna_rna[x]
end
rna.join('')
end
end发布于 2017-01-06 20:06:05
为此,我更喜欢使用Hash#fetch,因为它会在不匹配的情况下为您引发一个KeyError,允许您编写更少的代码来验证输入(即较少的防御性编程),我认为这比聪明(在这种情况下,我会推荐String#tr)更有价值。
class DNA
TranslationMap = { 'G' => 'C', 'C' => 'G', 'T' => 'A', 'A' => 'U' }
attr_reader :dna
def initialize(dna)
@dna = dna
end
def to_rna
dna.each_char.map do |nucleotide|
TranslationMap.fetch(nucleotide)
end.join('')
rescue KeyError
return false
end
end当错误被解救出来以满足你的需要时,请随时调整所发生的事情。我建议为调用方处理一个更具体的异常(例如DNA::InvalidNucleotide)。
在使用中:
dna = DNA.new 'GCTA'
# => #<DNA:0x007fc49e903818 @dna="GCTA">
dna.to_rna
# => "CGAU"
dna = DNA.new 'ACGTXXXCTTAA'
# => #<DNA:0x007fc49f064800 @dna="ACGTXXXCTTAA">
dna.to_rna
# => falsehttps://stackoverflow.com/questions/41513160
复制相似问题