2013-03-09 2 views
0

Ruby - это строго типизированный язык. Таким образом, он выполняет type conversion, а не type casting. Теперь существует два типа конверсий: implicit и explicit.Тип преобразования в Ruby

На основании каких правил рубин определяет, какое преобразование должно применяться в каком контексте?

+0

Забудьте о термине ["строго типизировано"] (http: //stackoverflow.com/a/9929697/395760). Он нечеткий, бессмысленный, бесполезный, возможно даже вредный. – delnan

+0

Я думаю, что у вас есть некоторые понятия, запутанные. * тип конвертация * и * тип литье * не альтернатива. * type casting * - это то, что может произойти в статически типизированном языке, но поскольку Ruby динамически типизирован, это не применяется. – troelskn

+0

@troelskn извинения. Я скорректировал свое описание. Я скорее поставил вместо, чем раньше. –

ответ

2

Ruby - это «утка типизированная», не имеющая сильной или слабой типизации, что означает, что поведение переменной/объекта не обязательно зависит от класса, к которому он принадлежит, но скорее «слепое» и выполняет вызов метода во время выполнения без type проверка. Если он не может этого сделать, он вызывает ошибку.

Ruby делает неявное преобразование для Integer, String и некоторых других внутренних классов. Выполнение преобразования зависит от левого операнда. Например,

1 + "2" 

Левый операнд является целым числом, поэтому рубин пытается выполнить математическую операцию +. Но правый операнд - это строка, поэтому ruby ​​попытается выполнить преобразование (совмещение) из строки в целое. (Хотя это все еще не удалось.Чтобы заставить его работать, нужно переопределить метод + для Integer или мы называем патч обезьяны, чтобы сделать явное преобразование, используя String # to_i)

+0

левый операнд - это «целое число», поэтому рубин пытался сделать такое неявное преобразование, используя 'to_int'. Но строка не имеет' to_int', поэтому неявное преобразование не удалось, и на экран появляется ошибка: 'TypeError: can not преобразовать String в Integer'. Я правильно понял? –

+0

@Priti yes and no ... Ruby использует тип coersion (что-то между литьем и coversion) для внутренних типов, а не напрямую вызывает метод to_xxx. – texasbruce