2016-10-07 3 views
2

У меня есть эта программа, которая в основном меняет строку и заменяет некоторые символы другими символами. Однако, когда я выполняю puts dna1, он дает это значение: DNA: 0x007fdb4214a918Почему Ruby дает странное значение?

Значение, которое оно должно дать, это 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

'puts' отпечатки' STDOUT' и возвращает 'nil' удалить путы, чтобы присвоить строку' dna2' также вы не 'инспектировать ', поэтому он по умолчанию указывает на' Object # inspect', о чем вы говорите. если вы определили 'def inspect; нуклеотид; end', то 'puts dna1' будет' 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 показывает имя класса и идентификатор объекта.

Вам нужно распечатать nucleotide

ли

class DNA 
    attr_reader :nucleotide 

Вам нужно это быть открытыми и не защищены.

и распечатать его с

puts dna1.nucleotide 

Аналогичная проблема с dna2. puts вернет nil, чтобы вы не могли его распечатать. Вы можете удалить puts и просто вернуть выражение.

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

Edit:

Поскольку вы хотите методы цепных вместе

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 

Для операций равенства, что вам нужно сделать

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

Смежные вопросы