我有这个程序基本上使用一个名为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
答案 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
是当前对象。在上面的示例中,self
是dna1
,它是DNA的一个实例。
警告:继承核心类是一个坏主意。如果OP慷慨地接受了这个答案,那么这个答案将被删除。有关从核心类继承的更多详细信息,请参阅link。