为什么我不能在ruby中为一个实例使用相同的方法两次?

时间:2016-10-08 05:31:42

标签: ruby

我有这个程序基本上使用一个名为reverse_complement的方法来反转字符串并用其他字符替换一些字符;但是,如果我对同一个实例使用该方法两次,则会给出一个未定义的错误。所以,把dna1.reverse_complement.reverse_complement == dna1.nucleotide给我一个真正的价值。但是,它给出了未定义的方法错误。

class DNA
  attr_reader :nucleotide

  def initialize (nucleotide)
     @nucleotide = nucleotide
  end
  def reverse_complement()
    @nucleotide.reverse.tr("ATCG", "TAGC")
  end

end
dna1 = DNA.new("ATTGCC")
puts dna1.reverse_complement

puts dna1.nucleotide

puts dna2 = dna1.reverse_complement


puts dna1.reverse_complement.reverse_complement == dna1.nucleotide

3 个答案:

答案 0 :(得分:4)

我认为你的方法有效,但这是你的链接问题:

puts dna1.reverse_complement.reverse_complement

您已定义reverse_complement以返回字符串,但您无法调用String#reverse_compliment

相反,写下这个:

dna2 = DNA.new(dna1.reverse_compliment)
puts dna2.reverse_compliment == dna1.nucleotide

答案 1 :(得分:2)

  

为什么我不能在ruby中为一个实例使用相同的方法两次?

因为您没有将它用于一个实例。您在dna1上调用它,这是DNA的一个实例,然后您再次调用reverse_complement的返回值,这是完全不同的实例 of class String

就我个人而言,我发现一个名为reverse_complement的方法会返回一个与它所调用的对象完全不同的对象,这让我感到非常困惑。我宁愿期望它返回相同类型的反向和补充实例,即DNA

class DNA
  def initialize(nucleotide)
    self.nucleotide = nucleotide.dup.freeze
  end

  def reverse_complement
    self.class.new(@nucleotide.reverse.tr('ATCG', 'TAGC'))
  end

  def ==(other)
    nucleotide == other.nucleotide
  end

  def to_s
    "DNA: #{nucleotide}"
  end

  protected

  attr_reader :nucleotide

  private

  attr_writer :nucleotide
end

dna1 = DNA.new('ATTGCC')
puts dna1.reverse_complement
# DNA: GGCAAT

puts dna2 = dna1.reverse_complement
# DNA: GGCAAT

puts dna1.reverse_complement.reverse_complement == dna1
# true

答案 2 :(得分:0)

这样的事情是否足够?:

class DNA < String
  def reverse_complement
    reverse.tr("ATCG", "TAGC")
  end
end

dna1 = DNA.new("ATTGCC")
puts dna1
# ATTGCC
puts dna1.reverse_complement 
# GGCAAT
puts dna1.reverse_complement.reverse_complement == dna1
# true

注释

def reverse_complement
  reverse.tr("ATCG", "TAGC")
end

可以写成:

def reverse_complement
  self.reverse.tr("ATCG", "TAGC")
end

其中self是当前对象。在上面的示例中,selfdna1,它是DNA的一个实例。

警告:继承核心类是一个坏主意。如果OP慷慨地接受了这个答案,那么这个答案将被删除。有关从核心类继承的更多详细信息,请参阅link