我有一个名为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
,它似乎与我的字符串选项不匹配。
答案 0 :(得分:2)
试试这个:
case option.to_i
# rest of your code...
在Ruby中,1 == "1"
(或更具体地说,在case
语句的情况下,1 === "1"
)始终评估为false
。在进行比较之前,您需要将其中一个转换为相同的类型。您为option
传入的值可能是String
,因此无法与整数进行任何比较。
答案 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)
注意:
return
。使用for
在Ruby中迭代数组或字符串很麻烦。相反,你应该使用
my_str.each_char do |char|
# use the single-character string `char` here
end
my_array.each do |item|
# use the item here
end
您可以使用$stdout.sync
强制输出始终被刷新。
chomp
来删除用户按Enter键时始终包含的尾随换行符。gets
的返回值是一个String,你将它与Fixnum进行比较。我在上面的代码中使用to_i
将字符串转换为整数进行比较。puts
而不是print
作为输出,这样我在结尾处得到一个换行符,并且不会让用户将下一个命令提示符放在与输出相同的行上。