首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在ruby中的一个实例中两次使用相同的方法?

为什么我不能在ruby中的一个实例中两次使用相同的方法?
EN

Stack Overflow用户
提问于 2016-10-08 05:31:41
回答 3查看 255关注 0票数 0

我有一个程序,它基本上使用一个名为reverse_complement的方法来反转一个字符串,并用其他字符替换一些字符;但是,如果我对同一个实例使用该方法两次,就会出现一个未定义的错误。所以,把dna1.reverse_complement.reverse_complement == true 1.核苷酸应该给我一个真实的值。然而,它给出了一个未定义的方法错误。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-08 06:32:59

这样的东西够吗?:

代码语言:javascript
复制
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

备注

代码语言:javascript
复制
def reverse_complement
  reverse.tr("ATCG", "TAGC")
end

可以写成:

代码语言:javascript
复制
def reverse_complement
  self.reverse.tr("ATCG", "TAGC")
end

其中self是当前对象。在上面的例子中,selfdna1,它是DNA的一个实例。

警告:从核心类继承是个坏主意。如果OP不接受这个答案,这个答案将被删除。有关从核心类继承的更多详细信息,请参见http://words.steveklabnik.com/beware-subclassing-ruby-core-classes

票数 0
EN

Stack Overflow用户

发布于 2016-10-08 05:35:34

我认为你的方法是可行的,但问题在于你的链结:

代码语言:javascript
复制
puts dna1.reverse_complement.reverse_complement

您已经定义了reverse_complement来返回一个字符串,并且不能调用String#reverse_compliment

相反,写这个:

代码语言:javascript
复制
dna2 = DNA.new(dna1.reverse_compliment)
puts dna2.reverse_compliment == dna1.nucleotide
票数 4
EN

Stack Overflow用户

发布于 2016-10-08 08:13:37

为什么我不能在ruby中的一个实例中两次使用相同的方法?

因为你没有在一个实例中使用它。您在dna1上调用它,这是DNA的一个实例,然后在reverse_complement的返回值上再次调用它,这是类String的一个完全不同的实例。

就我个人而言,我感到非常困惑的是,一个名为reverse_complement的方法会返回一个与它所调用的对象完全不同的对象。我更希望它返回相同类型的反向和互补实例,即DNA

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39929029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档