Ruby получает / помещает только для строк?

#ruby #integer

#ruby #целое

Вопрос:

Я новичок в Ruby и в настоящее время работаю над некоторым практическим кодом, который выглядит следующим образом:

 puts 'Hello there, Can you tell me your favourite number?'
num = gets.chomp
puts 'Your favourite number is '   num   '?'
puts 'Well its not bad but  '   num * 10   ' is literally 10 times better!'
  

Однако этот код просто помещает десять копий переменной num и фактически не умножает число, поэтому я предполагаю, что мне нужно сделать переменную ‘num’ целым числом? У меня не было успеха с этим, так что кто-нибудь может показать мне, где я ошибаюсь, пожалуйста?

Комментарии:

1. num = gets.chomp.to_i или num.to_i * 10 (ниже в вашем коде)

Ответ №1:

Если вы используете to_i , то chomp перед этим это избыточно. Итак, вы можете сделать:

 puts 'Hello there, Can you tell me your favourite number?'
num = gets.to_i
puts 'Your favourite number is '   num.to_s   '?'
puts 'Well its not bad but  '   (num * 10).to_s   ' is literally 10 times better!'
  

Но, как правило, использование "#{}" лучше, поскольку вам не нужно заботиться о to_s , и оно выполняется быстрее, и его легче увидеть. Этот метод String# особенно медленный.

 puts 'Hello there, Can you tell me your favourite number?'
num = gets.to_i
puts "Your favourite number is #{num}?"
puts "Well its not bad but  #{num * 10} is literally 10 times better!"
  

Ответ №2:

Используйте to_i метод, чтобы преобразовать его в целое число. Другими словами, измените это:

 num = gets.chomp
  

К этому:

 num = gets.chomp.to_i
  

Комментарии:

1. Я пробовал это, но получаю ту же ошибку: ‘RubyTest.rb: 3: в ` ‘: не удается преобразовать Fixnum в строку (TypeError) из RubyTest.rb: 3

2. @AppSlap: Упс, я думал, Ruby может неявно приводить при объединении строк и целых чисел. Когда вам нужно использовать со строкой и целым числом, сначала преобразуйте целое число в строку с to_s . Например: puts "Your number is " num.to_s "." .

3. @icktoofay спасибо за это, но я все еще получаю ту же ошибку. Мой код теперь выглядит следующим образом: помещает ‘Здравствуйте, не могли бы вы сказать мне свое любимое число?’ num = gets.chomp.to_i помещает ‘Ваше любимое число ‘ num.to_s ‘?’ ‘ Ну, это неплохо, но ‘ num * 10 ‘ буквально в 10 раз лучше!’

4. @AppSlap: ...' (num * 10).to_s '...

5. @AppSlap: Обратите внимание, что вам не нужно использовать, to_s если вы используете #{} вместо , что обычно предпочтительнее в ruby.

Ответ №3:

вы также можете убедиться, что число, которое использует пользователь, является целым числом таким образом:

 num = Integer(gets.chomp)
  

но вы должны создать способ перехватывать ошибку в случае, если пользователь вводит иначе, например, символ или строку so; это должно быть лучше использовать:

 num = gets.chomp.to_i
  

В случае, если пользователь ввел данные другого типа, num будет равен 0, как вы можете видеть в этом тестовом примере:

 puts "give me a number:"
num = gets.chomp.to_i
if num >3
 puts "#{num} es mayor a 3 "
else 
 puts "#{num} es menor a 3 o 3"
end
  

Это пример взаимодействия с этим скриптом:

 give me a number:
 sggd
0 es menor a 3 o 3
nil
  

Я надеюсь, что это лучше прояснит вашу точку зрения.

Комментарии:

1. Это хороший момент в использовании Integer(gets.chomp) и на самом деле это отличный способ убедиться, что вы действительно получили целое число. begin; print "enter a number "; num = Integer(gets.chomp); rescue ArgumentError; puts "That's not a number, try again"; retry; end; puts num > 3 ? "#{num} is greater than 3" : "#{num} is less than 3 or 3"

Ответ №4:

Я написал похожую на вашу программу. Вот как я, наконец, заставил это работать должным образом! Мне пришлось назначить любимое число целым числом. Затем в следующей строке я установил new_fav_num со значением fav_num 1, а затем преобразовал его в строку. После этого вы можете просто вставить свой код в оператор return, который вы хотите передать пользователю, только вам нужно преобразовать первое fav_num в строку.

 puts "What is your favorite number?"

fav_num = gets.chomp.to_i

new_fav_num = (fav_num   1).to_s

puts "Your favorite number is "   fav_num.to_s   ". That's not bad, but "  
new_fav_num   " is bigger and better!"  

Надеюсь, это поможет.