Объект Fixnum не меняет значение после увеличения - PullRequest
0 голосов
/ 25 ноября 2018

Я только начал изучать Ruby и столкнулся с этими двумя функциями:

def increase(n)
    n = n + 1
    return n
end

def add_element(array, item)
    array << item
end

Когда я попытался увеличить (n) с n = 5

c = 5
p10.increase(c)
print("c is #{c}\n")
print("c.class is #{c.class}\n")
--> c is 5
--> c.class is Fixnum

Значение c не меняетсяпосле увеличения внутри увеличения (n)

Когда я пытался изменить содержимое массива arr = [1,2,3,4] с помощью add_element, arr действительно меняется.

arr = [1, 2, 3, 4]
p10.add_element(arr, 5)
print("array is #{arr}\n")
--> array is [1, 2, 3, 4, 5]

Так что, если все в Ruby является объектом, почему arr меняет свое значение, а c (объект Fixnum) не меняет своего значения?

Ваша мысль приветствуется.:) Спасибо

1 Ответ

0 голосов
/ 25 ноября 2018

В Ruby есть "особые" объекты, которые нельзя изменить.Fixnum является одним из них (другие являются логическими значениями, nil, символы, другие цифры).Ruby также передается по значению.

n = n + 1 не изменяет n, оно переназначает локальную переменную в области действия increase.Поскольку Fixnum не является изменяемым, не существует метода, который вы могли бы использовать для изменения его значения, в отличие от массива, который вы можете изменять с помощью нескольких методов, << является одним из них.

add_elementявно изменяет переданный объект с помощью <<.Если вы измените тело метода на

array = array + [item]

, тогда вывод во втором примере будет array is [1, 2, 3, 4], так как это просто переназначение локальной переменной.

...