我有一个程序,它基本上使用一个名为reverse_complement的方法来反转一个字符串,并用其他字符替换一些字符;但是,如果我对同一个实例使用该方法两次,就会出现一个未定义的错误。所以,把dna1.reverse_complement.reverse_complement == true 1.核苷酸应该给我一个真实的值。然而,它给出了一个未定义的方法错误。
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发布于 2016-10-08 06:32:59
这样的东西够吗?:
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不接受这个答案,这个答案将被删除。有关从核心类继承的更多详细信息,请参见http://words.steveklabnik.com/beware-subclassing-ruby-core-classes。
发布于 2016-10-08 05:35:34
我认为你的方法是可行的,但问题在于你的链结:
puts dna1.reverse_complement.reverse_complement您已经定义了reverse_complement来返回一个字符串,并且不能调用String#reverse_compliment。
相反,写这个:
dna2 = DNA.new(dna1.reverse_compliment)
puts dna2.reverse_compliment == dna1.nucleotide发布于 2016-10-08 08:13:37
为什么我不能在ruby中的一个实例中两次使用相同的方法?
因为你没有在一个实例中使用它。您在dna1上调用它,这是DNA的一个实例,然后在reverse_complement的返回值上再次调用它,这是类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
# truehttps://stackoverflow.com/questions/39929029
复制相似问题