문제

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"}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top