루비에서 '참조로 패스 매개 변수'?
-
03-07-2019 - |
문제
Ruby에서는 값 유형 시맨틱 (예 : Fixnum)이있는 매개 변수를 참조로 전달할 수 있습니까? C#'s'와 비슷한 것을 찾고 있습니다.심판'키워드.
예시:
def func(x)
x += 1
end
a = 5
func(a) #this should be something like func(ref a)
puts a #should read '6'
BTW. 나는 그냥 사용할 수 있다는 것을 안다 :
a = func(a)
해결책
현재 바인딩을 명시 적으로 통과하여이를 달성 할 수 있습니다.
def func(x, bdg)
eval "#{x} += 1", bdg
end
a = 5
func(:a, binding)
puts a # => 6
다른 팁
Ruby는 "Pass By Reference"를 전혀 지원하지 않습니다. 모든 것이 객체이며 해당 객체에 대한 참조는 항상 가치별로 전달됩니다. 실제로, 당신의 예에서 당신은 참조 사본을 전달합니다. Fixnum
가치에 따른 개체.
코드의 문제는 그 것입니다 x += 1
통과 된 것을 수정하지 않습니다 Fixnum
물체는 대신 완전히 새롭고 독립적 인 객체를 만듭니다.
나는 Java 프로그래머가 전화 할 것이라고 생각합니다 Fixnum
사물 불변.
루비에서는 참조로 매개 변수를 전달할 수 없습니다. 예를 들어, 새 값을 반환하고 변수 A에 할당하거나 값을 포함하는 새 클래스를 만들고이 클래스의 인스턴스를 전달해야합니다. 예시:
class Container
attr_accessor :value
def initialize value
@value = value
end
end
def func(x)
x.value += 1
end
a = Container.new(5)
func(a)
puts a.value
다음 트릭을 시도 할 수 있습니다.
def func(x)
x[0] += 1
end
a = [5]
func(a) #this should be something like func(ref a)
puts a[0] #should read '6'
http://ruby-doc.org/core-2.1.5/fixnum.html
Fixnum 객체는 즉각적인 값을 갖습니다. 이것은 매개 변수로 할당되거나 전달 될 때 해당 객체에 대한 참조가 아니라 실제 객체가 전달됨을 의미합니다.
그러나 해시와 같은 복합 객체는 참조로 전달되는 것 같습니다.
fp = {}
def changeit(par)
par[:abc] = 'cde'
end
changeit(fp)
p fp
주어진
{:abc=>"cde"}
제휴하지 않습니다 StackOverflow