2016-10-07 13 views
2

私はこのプログラムを基本的に文字列を反転させ、いくつかの文字を他の文字に置き換えます。しかし、puts dna1を実行すると、次の値が得られます。DNA:0x007fdb4214a918Rubyがなぜ奇妙な価値を与えているのですか?

値は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

を行う必要がありますまた、あなたは何の '検査していません'メソッドを呼び出すので、デフォルトで' Object#inspect'が参照されます。 'def inspect;を定義した場合。ヌクレオチド;現在のヌクレオチドを 'puts'します – engineersmnky

答えて

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に割り当てますが、それほど有用ではありません。

0

dna1は、クラスDNAのインスタンスです。

DNA:0x007fdb4214a918には、クラス名とオブジェクトIDが表示されます。

あなたはnucleotide

あなたは保護され、公開していないする必要が

class DNA 
    attr_reader :nucleotide 

を行い印刷する必要があります。

dna2

puts dna1.nucleotide 

同様の問題と、それを印刷します。 putsnilを返しますので、印刷できません。 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 

、あなたがdna2` `に文字列を割り当てるために、` `STDOUT`とリターンにputs`プリントが`プットを削除nil`

puts dna1.reverse_complement.reverse_complement.nucleotide == dna1.nucleotide 
#=> true 
+0

さて、私はあなたが提案した変更を行いました。しかし、なぜこれはdna1.reverse_complement.reverse_complement == dna1がtrueを返さないのでしょうか? – Codes316

+0

'dna1'は文字列ではないオブジェクトです。あなたは 'DNA.new'でクラスをインスタンス化しています。これが' dna1'に割り当てられています。 'dna1.reverse_complement 'を実行する必要があります。reverse_complement == dna1.nucleotide' – rohit89

+0

まだ未定義のメソッドエラーが出ます。 – Codes316

関連する問題