为什么Ruby会给出一个奇怪的值?

时间:2016-10-07 20:09:42

标签: ruby

我有这个程序基本上反转一个字符串并用其他字符替换一些字符。但是,当我执行puts dna1时,它给出了这个值:DNA:0x007fdb4214a918

应该给出的价值是ATTGCC。

以下是代码:

class DNA
  def initialize (nucleotide)
     @nucleotide = nucleotide
  end
  def reverse_complement()

    puts nucleotide.reverse.tr("ATCG", "TAGC")
  end
  protected

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

puts dna1

puts dna2 = dna1.reverse_complement

2 个答案:

答案 0 :(得分:1)

# first you have
# ATTGCC
# then you reverse
# CCGTTA
# then you substitute
# CCGTTA
# A:T, T:A, C:G, G:C
# GGCAAT

它完全符合您的要求。

现在,您还有一个问题。您在#puts中返回reverse_complement,的结果,因此您永远不会将计算值分配给dna2。此外,您将实例对象分配给dna1,但打印并不是非常有用。

答案 1 :(得分:0)

dna1是类DNA的一个实例。

DNA:0x007fdb4214a918显示类名和对象ID。

您需要打印nucleotide

待办事项

class DNA
  attr_reader :nucleotide

您需要将其公开并且不受保护。

并用

打印
puts dna1.nucleotide

dna2的类似问题。 puts将返回nil,因此您无法打印它。 您可以删除puts并返回表达式。

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

编辑:

因为你想把方法连在一起

class DNA
  attr_reader :nucleotide

  def initialize(nucleotide)
    @nucleotide = nucleotide
  end

  def reverse_complement
    self.class.new(@nucleotide.reverse.tr("ATGC", "TAGC"))
  end

  def to_s
    @nucleotide
  end
end

因为你想调用reverse_complement.reverse_complement,你必须使用self.class.new而不是字符串返回一个新的类对象。

to_s方法允许您执行puts dna1并获取字符串。

puts dna1.reverse_complement
#=> GGCAAT
puts dna1
#=> ATTGCC

对于平等操作,您需要执行

puts dna1.reverse_complement.reverse_complement.nucleotide == dna1.nucleotide
#=> true