Задание 5-4: как избежать ошибок иницированных переменных?

[А] Алексей Щёголев, 21 июля 2016, 19:51 , 2 подписчика
puts "Task 5-4:  Guess the number (0..16) \n"
myNumber = rand(0..16)
puts myNumber
puts "I guess the nunber from 0 to 16. Guess it. Put your version."
puts "Shot 1:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
    abort "You are WINNER!"
else 
    TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
    if TemperatureDeviation > 0 
        Side = "LESS"
    else 
        Side = "MORE"
    end
    if TemperatureDeviation.abs > 3 # определяем отклонение
        Temperature = "(cold)"
    else
        Temperature = "(warm)"
    end
end
puts Side + " " + Temperature

puts "Shot 2:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
    abort "You are WINNER!"
else 
    TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
    if TemperatureDeviation > 0 
        Side = "LESS"
    else 
        Side = "MORE"
    end
    if TemperatureDeviation.abs > 3
        Temperature = "(cold)"
    else
        Temperature = "(warm)"
    end
end
puts Side + " " + Temperature

puts "Shot 3:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
    abort "You are WINNER!"
else 
    TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
    if TemperatureDeviation > 0 
        Side = "LESS"
    else 
        Side = "MORE"
    end
    if TemperatureDeviation.abs > 3
        Temperature = "(cold)"
    else
        Temperature = "(warm)"
    end
end
puts Side + " " + Temperature
puts "You do not have guessed. try again"

В результате получаю вот такое в консоли:

Скриншот консоли

Я понимаю, Что можно в каждом блоке назвать все переменные уникально и тогда этих ошибок не будет... но может есть какой-то более простой способ, например обнулить? Или я вообще не в том направлении думаю ?

PS Простите мой кривой английский, я его тоже только учу.

Обсуждение (5)


Алексей Щёголев

[А]

if TemperatureDeviation.abs > 3 # определяем отклонение
        Temperature ||= "(cold)"
else
        Temperature ||= "(warm)"
end
puts Side + " " + Temperature

Если вот так записать, то не ругается... нагуглил на каком то форуме, но что эта запись означает, так и не понял... Продолжает ругаться на переопределение UserAnsver

UserAnsver ||= gets.to_i

не запрашивает ввод у пользователя


Михаил Бутлицкий Учитель

[М]

Здесь корень ошибки в том, что в Руби с большой буквы начинаются названия констант.

Константы это переменные, которые объявляются один раз и больше не должны меняться. Руби очень гибкий и позволяет их менять, но ругается :)

Подробнее про это есть тут http://rubylearning.com/satishtalim/ruby_constants.html

Это свойственно многим языкам. Вообще повсеместная практика — названия переменных начинать с маленькой буквы.

так_принято_в_руби
аТакПринятовJava # это называется CamelCase 

https://ru.wikipedia.org/wiki/CamelCase


Алексей Щёголев

[А]

Вот оно чо! А я все искал, как из этих констант сделать переменные.

А про ||= можешь пояснить? Что эта запись значит?


Михаил Бутлицкий Учитель

[М]

Коротко этот оператор значит Присвоить переменной значение только если переменная еще пуста (т. е. nil или false)

Подробнее

variable ||= 'Value'

По аналогии с += это можно представить как

variable = variable || 'Value'

Это не совсем правильная интерпретация, но она наглядна. При вычислении правой части если variable возвращает неложное значение (т. е. по понятиям руби не false и не nil), то это значение и берется как результат. Если ложное, то результатом берется следующий аргумент 'Value'.

Более строгое и подробное объяснение работы этого оператора http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


Алексей Щёголев

[А]

Ага, все получилось, спасибо.