2012-06-25 4 views
1

У меня один файл с именем Exercises.rbДело заявление не работает, как ожидалось

def ask(prompt) 
    print prompt, ' ' 
    $stdout.flush 
    s = gets 
    return s 
end 

def myreverse(s) 
    aux="" 
    for i in 0..s.length-1 
    aux=s[i] + aux 
    end 
    return aux 
end 

def mywordreverse(s) 
    aux=[] 
    s=s.split(" ") 
    for i in 0..s.length-1 
    aux.unshift(s[i]) 
    end 
    return aux.join(" ") 
end 

def choose(s,option) 
    case option 
    when 1 then print myreverse(s) 
    when 2 then print mywordreverse(s) 
    when 3 then print "hello" 
    else print "You gave me #{option} -- I have no idea what to do with that." 
    end 
end 

s=ask("Write a string to reverse: ") 
option=ask("Choose an option. 1 - Reverse string. 2 - Reverse String words : ") 

choose(s,option) 

Я всегда получаю You gave MYCHOSENOPTION -- I have no idea what to do with that., независимо от того, какой вариант выбрать. Если я поставлю if непосредственно перед case, сравнивая 1, он просто не подходит для моих строк.

ответ

1

FWIW, вот как я бы написать эту программу:

def ask(prompt) 
    print "#{prompt} " 
    gets.chomp 
end 

def myreverse(s) 
    s.reverse 
end 

def mywordreverse(s) 
    s.split(' ').reverse.join(' ') 
end 

def choose(s,option) 
    case option 
    when 1 then puts myreverse(s) 
    when 2 then puts mywordreverse(s) 
    when 3 then puts "hello" 
    else  puts "You gave me #{option}; I don't know what to do with that." 
    end 
end 

$stdout.sync 
str = ask("Write a string to reverse: ") 
option = ask("Choose an option:\n1: Reverse string\n2: Reverse String words\n>") 
choose(str,option.to_i) 

Примечания:

  1. Последнее выражение в методе является возвращаемое значение; с использованием return почти никогда не требуется или не требуется в Ruby.
  2. Существуют встроенные методы для реверсирования строк и массивов. (Я понимаю, если вы делаете это для упражнений.)
  3. Это громоздко для повторения массивов или строк в Ruby с использованием for. Вместо этого, вы должны использовать

    my_str.each_char do |char| 
        # use the single-character string `char` here 
    end 
    
    my_array.each do |item| 
        # use the item here 
    end 
    
  4. Вы можете использовать, чтобы заставить $stdout.sync выход всегда промывать.

  5. Вам нужно использовать chomp на вашей строке, чтобы удалить конечную новую строку, всегда включаемую, когда пользователь нажимает Enter.
  6. Как указано @robbrit, ядро ​​вашей проблемы состоит в том, что возвращаемое значение gets является строкой, и вы сравниваете ее с Fixnum. Я использовал to_i в моем коде выше, чтобы преобразовать строку в целое число для сравнения.
  7. Я использовал puts вместо print для вывода, чтобы я получил новую строку в конце и не оставляю пользователя с их следующей командной строкой в ​​той же строке, что и вывод.
+0

Привет, Фрогз, я действительно думал, что знаю свой ответ, но я так люблю тебя, что буду придерживаться его. Моя первая проблема заключалась в том, что сравнение 1 === "1" на самом деле ложно. Моя вторая проблема заключалась в том, что chomp, которого не хватало, и мне было тяжело. Я действительно попал туда, проверяя длину моей строки опций. Что касается пунктов 2 и 3, у вас есть острый глаз :-). Я создал их для поддержки процесса собеседования, абстрактного для языка, поэтому я ответил ему на самый низкий уровень/ближе к C.На каждом языке (и мне нравится рубин все больше и больше) будут разные способы решения этой проблемы. – MrWater

+0

Во всяком случае, я узнал из вашего ответа и благодарю вас за это. Приветствия. – MrWater

2

Попробуйте это:

case option.to_i 
    # rest of your code... 

В Ruby 1 == "1" (или более конкретно в случае case заявления, 1 === "1") всегда имеет значение false. Вам нужно будет преобразовать один из них, чтобы они были одного типа перед выполнением сравнения. Значение, которое вы передаете для option, вероятно, является String и поэтому не сможет сравниться с целыми числами.

+0

Привет, спасибо robbrit. Это была моя первая дилемма, и я переключился с 1,2,3 на «1», «2», «3» (на самом деле 1,2, 3 был всего лишь испытанием). Однако to_i решит эту проблему. Что было бы более эффективным, конвертировать в int или сравнивать символы? – MrWater

+0

Теоретически сравнение строк было бы более эффективным, потому что вам не нужно разбирать что-либо, однако разница настолько миниатюрна, что я сомневаюсь, что это действительно имеет значение. – robbrit

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