2015-01-25 4 views
-4
  1. Я хочу знать, как я могу объявить несколько переменных. Я напечатал a,b=1 ожидал получить a=1,b=1, но я получил:Как объявить несколько переменных

    a,b=1 
    a #=> 1 
    b #=> nil 
    

    Как я могу это сделать?

  2. После этого кода я сделал:

    a="Hello " 
    b=a 
    c="World~" 
    b << c 
    b #=> "Hello World" 
    

    Почему b так же, как a значение «s?

+4

Вы можете задать только один вопрос за один раз. Это твердое правило. Однако, если вы отправляете Q2 в качестве отдельного вопроса, кто-то, вероятно, укажет, что 'b = a' заставляет' a' и 'b' указывать на один и тот же объект (например,' a.object_id # => 70270098990060; b .object_id; # => 70270098990060'), поэтому, если объект изменен, он будет отражен в значениях как 'a', так и' b'. –

+1

Как и 'a = b = 1', есть также« параллельное назначение »:' a, b, c = 1,2,3; [А, б, в] => [1,2,3] '. –

ответ

3

Чтобы объявить несколько ВАР на одной и той же линии, вы можете сделать это:

a = b = "foo" 
puts a # return "foo" 
puts b # return "foo" too 

О втором вопросе, при выполнении b << c, вы присваиваете значение c «s к b. Затем вы переопределяете предыдущее значение, хранящееся в b. Между тем, a сохраняет одно и то же значение, поскольку Ruby не является указателем пользователя.

2

То, что вы делаете, называется назначением деструктурирования. В принципе, вы берете то, что находится на правой стороне знака равенства, и разрушаете его, или разбиваете на части, а затем назначаете каждый раздел каждой соответствующей переменной слева.

Ruby очень дружелюбный и предоставляет синтаксический сахар, который может сбить с толку.

При вводе этого:

a, b = 1 

Вы действительно говорят что-то ближе к этому:

[a, b] = [1, nil] 

Хороший пример задания можно уничтожения того можно найти here. Это для JavaScript, но мне это нравится, потому что синтаксис очень ясен о том, что происходит, когда вы делаете такой настрой.

0

Я полагаю, в случае

a, b, c = 1, 2 

исполняющая система работает следующим образом:

a, b, c = [1, 2] 

_result = (a, b, c = (_values = [1, 2])) 

a = _values[0] # => 1 

b = _values[1] # => 2 

c = _values[2] # => nil 

_result = _values # => [1, 2] 

Однако в случае одного значения на правой стороне: a, b = 1, процесс вычисления выглядит несколько иначе:

Может кто-то одобрить или d оправдывает мое предположение?

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