2014-01-21 2 views
0

Когда я типаУ меня есть целые числа в массиве, что мне нужно, преобразованных в строки

digicollect=[] 
digicollect[0]=2 

Я получаю 2, когда я набираю в digicollect в IRB.

Кроме того, когда я набираю в

"Hello" * 2 

я получаю "HelloHello"

Но если я типа в

2 * "Hello" 

он не работает.

"hello" * digicollect 

не работает. но

"hello" * digicollect[0] 

. Произведение.

Почему?

+0

отсутствует очень важный тег. какую технологию вы используете? – Sachin

+0

Я использую командную строку и irb внутри нее. ruby version 2.0 – maudulus

ответ

0

Все в рубине - это объект, и даже умножения - это просто вызовы методов.

"Hello" * 2 такая же, как "Hello".*(2)

Итак, когда вы получите сообщение об ошибке, вы должны спросить себя: Есть ли левая рука действительно есть метод умножения и он будет принимать на правую сторону в качестве аргумента?

digicollect = [] 
digicollect[0] = 2 

Давайте проверим, какие объекты мы имеем:

p digicollect.class #=> Array 
p digicollect[0].class #=> Fixnum 
p 2.class #=> Fixnum 
p "Hello".class #=> String 

Теперь, если мы идем в Документах для * -метода мы находим, что каждый класс ожидать:

http://ruby-doc.org/core-2.1.0/String.html#method-i-2A 
http://ruby-doc.org/core-2.1.0/Array.html#method-i-2A 
http://ruby-doc.org/core-2.1.0/Fixnum.html#method-i-2A 

Там мы найдем, что будет:

  • String ex pect Integer. (несколько раз для повторения строки)
  • Array ожидает целое число или строку.(повторить массив x раз или присоединиться к строке)
  • Fixnum ожидает цифровую. (Для простого умножения)

Таким образом, когда вы пишете "hello" * digicollect вы пытаетесь вызвать метод умножения жала и передать его массив, а метод просто не знает, как справиться с этим (он будет принимать только целые числа), поэтому вы получаете ошибку.

+0

Я вижу. Это действительно полезно. Есть ли способ увидеть предложения? – maudulus

+0

Я немного смущен тем, что вы набрали «String excepts и Integer Array, за исключением Integer или String Fixnum ожидает числовое или целое число». К исключениям вы имеете в виду принятие или ожидание? – maudulus

+0

Извините, я спешил, я имею в виду ожидаю (или принимает). – hirolau

-1

digicollect сам по себе не является числовым, поэтому вы не можете «размножаться» им. Он содержит числа, однако, поэтому «привет» * digicollect [0] работает.

Что касается случая 2 * «Привет», я считаю, что это синтаксическая вещь о языке. Строка должна быть первой, а целая вторая.

+0

Хорошо, получилось. Большое спасибо :) – maudulus

0

Я должен предисловие к этому, сказав, что я не получаю 2, когда я печатаю digicollect в irb ... Я получаю [2]. Это массив из одного элемента со значением 2. Это очень отличается от целочисленного значения 2.

У строки нет оператора * для аргумента массива, а число не имеет оператора * со строковым аргументом. Однако String имеет * с аргументом number, а digicollect[0] - это числовое значение этого элемента массива.

+0

Хорошо спасибо! Итак, теперь мне интересно, почему, если я нахожу «привет» * (digicollect [0] -5), он не даст мне ответа, просто «отрицательный аргумент»? – maudulus

+0

Вы не можете умножить строку на отрицательное число. Если, например, 'digicollect [0]' равно 2, вы вычитаете 5, давая -3. – Darren

+0

OOOh, ок. Благодаря! – maudulus

Смежные вопросы