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

为什么Ruby会给出一个奇怪的值?,ruby,Ruby,我有一个程序,它基本上反转一个字符串,并用其他字符替换一些字符。但是,当我执行puts dna1时,它会给出以下值:DNA:0x007fdb4214a918 它应该给出的值是ATTGCC 代码如下: class DNA def initialize (nucleotide) @nucleotide = nucleotide end def reverse_complement() puts nucleotide.reverse.tr("ATCG", "TAGC")

我有一个程序,它基本上反转一个字符串,并用其他字符替换一些字符。但是,当我执行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
它完全按照你的要求做了


现在,您还有一个问题。您返回
#将
放入反向补码中的结果,,因此您永远不会将计算值分配给
dna2
。此外,您还可以将实例对象指定给
dna1
,但打印并不十分有用。

dna1
是类
DNA
的实例

DNA:0x007fdb4214a918
显示类名和对象id

您需要打印
核苷酸

你需要它是公开的,而不是受保护的

并用

puts dna1.nucleotide
与dna2类似的问题
put
将返回
nil
,因此您无法打印它。 您可以删除
put
,然后只返回表达式

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\u complete.reverse\u complete
,因此必须使用字符串以外的
self.class.new
返回新的类对象

puts dna1.reverse_complement
#=> GGCAAT
puts dna1
#=> ATTGCC
to_s
方法允许您执行
put dna1
并获取字符串

puts dna1.reverse_complement
#=> GGCAAT
puts dna1
#=> ATTGCC
对于相等操作,您需要执行以下操作

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

put
打印到
STDOUT
并返回
nil
remove put以将字符串分配给
dna2
而且您没有
inspect
方法,因此它默认为您所指的
Object#inspect
。如果定义了
def检查;核苷酸;结束
然后放入dna1将放入当前的核苷酸好的,我做了你建议的更改。但是,为什么这个dna1.reverse\u complete.reverse\u complete==dna1不返回值true?
dna1
是一个对象而不是字符串。您正在用
DNA.new
实例化一个类,这就是分配给
dna1
的内容。你需要做dna1.reverse\u complete.reverse\u complete==dna1.nucleotide你把
attr\u reader:nucleotide
放在
类DNA
之后了,而不是放在
受保护的
之后了吗?是的,我已经这样设置好了。它仍然会出现错误。请检查我的编辑。您需要返回一个类以链接方法。
puts dna1.reverse_complement.reverse_complement.nucleotide == dna1.nucleotide
#=> true