Ruby 'referans ile bu parametre geçirmek'?

oy
26

Ruby, bu (örneğin, bir Fixnum) referans ile bu değer-tipi semantik ile parametre geçirmek mümkündür? C # 's' benzer bir şey arıyorum ref 'anahtar kelime.

Örnek:

def func(x) 
    x += 1
end

a = 5
func(a)  #this should be something like func(ref a)
puts a   #should read '6'

Btw. Ben sadece kullanabilirsiniz biliyorum:

a = func(a)
Oluştur 02/10/2008 saat 08:33
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
19

Yakut hiç "referans olarak geçmek" desteklemez. Her bir nesne olup bu nesne için referanslar, her zaman değer geçirilir. Aslında, örnekte size atfen bir kopyasını geçiyoruz Fixnumdeğeriyle Nesne.

Senin koduyla sorun yani, x += 1geçmiş değiştirmez FixnumNesne ancak bunun yerine tamamen yeni ve bağımsız bir nesne oluşturur.

Ben çağırır Java programcıları, düşünmek Fixnumnesneleri değişmez .

Cevap 02/10/2008 saat 09:00
kaynak kullanıcı

oy
31

Açıkça geçerli bağlama geçen gerçekleştirebilirsiniz:

def func(x, bdg)
  eval "#{x} += 1", bdg
end

a = 5
func(:a, binding)
puts a # => 6
Cevap 02/10/2008 saat 09:06
kaynak kullanıcı

oy
11

Ruby size referans olarak parametreleri geçemez. senin Örneğin, yeni değer döndürmek ve değişken a atamak veya değeri içeren yeni bir sınıf oluşturmak ve etrafında bu sınıfın bir örneğini geçmesi gerekecekti. Örnek:

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
Cevap 02/10/2008 saat 09:13
kaynak kullanıcı

oy
6

Sen şu hile deneyebilirsiniz:

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'
Cevap 02/03/2015 saat 05:01
kaynak kullanıcı

oy
2

http://ruby-doc.org/core-2.1.5/Fixnum.html

Fixnum nesneler hemen değere sahiptirler. Bu parametre olarak verilen ya da geçirildiğinde, gerçek bir nesne yerine bu nesne için bir referans değil, geçmiş olduğu anlamına gelir.

Ayrıca Ruby değeri pass .

Cevap 02/03/2016 saat 04:53
kaynak kullanıcı

oy
0

Ancak, sağlamalarının gibi kompozit nesneler, başvuruya göre iletilir görünüyor:

fp = {}
def changeit(par)
  par[:abc] = 'cde'
end

changeit(fp)

p fp

verir

{:abc=>"cde"}
Cevap 16/05/2019 saat 14:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more