我有这个程序基本上反转一个字符串并用其他字符替换一些字符。但是,当我执行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
答案 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