2016-10-07 7 views
2

Ich habe dieses Programm, das im Grunde eine Zeichenfolge umkehrt und einige Zeichen durch andere Zeichen ersetzt. Wenn ich jedoch puts dna1 führe, gibt es diesen Wert: DNA: 0x007fdb4214a918Warum gibt Ruby einen seltsamen Wert?

Der Wert, den es geben sollte, ist ATTGCC. Hier

ist der Code:

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

'puts' Drucke' STDOUT' und kehrt 'tun nil' puts entfernen Sie die Zeichenfolge zuweisen zu' dna2' Sie haben auch keine 'inspizieren 'Methode so standardmäßig auf" Object # inspect ", was Sie beziehen sich auf. wenn Sie "def inspect" definiert haben; Nukleotid; end 'then' puts dna1' würde '' 'das aktuelle' nucleotide' setzen – engineersmnky

Antwort

1
# first you have 
# ATTGCC 
# then you reverse 
# CCGTTA 
# then you substitute 
# CCGTTA 
# A:T, T:A, C:G, G:C 
# GGCAAT 

Es tat genau das, was Sie gefragt, es zu.

Jetzt haben Sie ein zusätzliches Problem. Sie geben das Ergebnis #puts in reverse_complement, zurück, so dass Sie den berechneten Wert nie dna2 zuweisen. Außerdem weisen Sie das Instanzobjekt dna1 zu, aber das Drucken ist nicht sehr nützlich.

0

dna1 ist eine Instanz der Klasse DNA.

DNA:0x007fdb4214a918 zeigt den Klassennamen und die Objekt-ID.

Sie benötigen

class DNA 
    attr_reader :nucleotide 

Sie nucleotide

Müssen drucken Sie es öffentlich und nicht geschützt sein.

und drucken Sie es mit

puts dna1.nucleotide 

ähnliches Problem mit dna2. puts wird nil zurückgeben, so dass Sie es nicht drucken können. Sie können die puts entfernen und nur den Ausdruck zurückgeben.

def reverse_complement() 
    @nucleotide.reverse.tr("ATCG", "TAGC") 
end 

Edit:

Da Sie zu Ketten Methoden wollen zusammen

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 

Weil Sie reverse_complement.reverse_complement anrufen möchten, müssen Sie ein neues Klassenobjekt zurückzukehren mit self.class.new als die Zeichenfolge.

Die to_s Methode können Sie puts dna1 tun und die Zeichenfolge abrufen.

puts dna1.reverse_complement 
#=> GGCAAT 
puts dna1 
#=> ATTGCC 

Für Gleichheit Operationen, müssen Sie

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

Okay, ich habe die Änderungen vorgenommen, die Sie vorgeschlagen haben. Warum gibt dna1.reverse_complement.reverse_complement == dna1 den Wert true jedoch nicht zurück? – Codes316

+0

'dna1' ist ein Objekt, kein String. Du initiierst eine Klasse mit 'DNA.new' und das wird" dna1 "zugewiesen. Sie müssen 'dna1.reverse_complement machen.reverse_complement == dna1.nucleotide' – rohit89

+0

es gibt mir immer noch einen undefinierten Methodenfehler. – Codes316

Verwandte Themen