首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果某个字符被传递给它,则停止循环

如果某个字符被传递给它,则停止循环
EN

Stack Overflow用户
提问于 2017-01-06 19:43:53
回答 3查看 89关注 0票数 1

所以我正在做一个小任务,把DNA链转录成RNA链。我的当前代码如下:

代码语言:javascript
复制
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无关的字母时失败并退出呢?

编辑:我试图通过的测试如下所示:

代码语言:javascript
复制
def test_dna_correctly_handles_partially_invalid_input
  # skip
  assert_equal '', Complement.of_dna('ACGTXXXCTTAA')
end

我从下面尝试了@Holger的想法,并收到了以下错误:

代码语言:javascript
复制
 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'

我从上述方法中得到的通常失败是:

代码语言:javascript
复制
1) Failure:
ComplementTest#test_dna_correctly_handles_partially_invalid_input [rna_transcription_test.rb:48]:
Expected: ""
  Actual: "UGCAGAAUU"

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-06 20:00:26

尝尝这个

代码语言:javascript
复制
class Complement
  def self.of_dna(str)
    return "" if str =~ /[^GCTA]/
    ...
  end
end

有趣的是,你甚至不需要一个循环来替换字符

代码语言:javascript
复制
str = 'GATTACA'
str.tr('ATCG', 'UAGC')
# => 'CUAAUGU'

这就是你所需要的。

票数 4
EN

Stack Overflow用户

发布于 2017-01-06 19:52:29

您还可以在regex中匹配X,如果在字符串中找到erorr处理,则执行一些erorr处理。这可能是这样的:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-01-06 20:06:05

为此,我更喜欢使用Hash#fetch,因为它会在不匹配的情况下为您引发一个KeyError,允许您编写更少的代码来验证输入(即较少的防御性编程),我认为这比聪明(在这种情况下,我会推荐String#tr)更有价值。

代码语言:javascript
复制
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)。

在使用中:

代码语言:javascript
复制
dna = DNA.new 'GCTA'
 # => #<DNA:0x007fc49e903818 @dna="GCTA"> 
dna.to_rna
 # => "CGAU" 
dna = DNA.new 'ACGTXXXCTTAA'
 # => #<DNA:0x007fc49f064800 @dna="ACGTXXXCTTAA"> 
dna.to_rna
 # => false
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41513160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档