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在比较 1 之前放一个case,它似乎与我的字符串不匹配。

4

2 回答 2

2

试试这个:

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

在 Ruby 中1 == "1"(或者更具体地说,在case语句的情况下,1 === "1")总是计算为false. 在进行比较之前,您需要将其中一个转换为相同的类型。您传入的值option可能是 a String,因此对于与整数的任何比较都将失败。

于 2012-06-25T16:55:44.417 回答
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. 方法中的最后一个表达式返回值;usingreturn在 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输出,以便在最后得到一个换行符,并且不要让用户将下一个命令提示符留在与输出相同的行上。
于 2012-06-25T17:12:11.083 回答