为什么Ruby会给出一个奇怪的值?
我有一个程序,它基本上反转一个字符串,并用其他字符替换一些字符。但是,当我执行puts dna1时,它会给出以下值:DNA:0x007fdb4214a918 它应该给出的值是ATTGCC 代码如下:为什么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")
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