سؤال

في روبي ، هل من الممكن أن يمر بها إشارة معلمة مع قيمة من نوع دلالات (مثلا ، أ 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'

راجع للشغل.أنا أعرف فقط يمكن استخدام:

a = func(a)
هل كانت مفيدة؟

المحلول

يمكنك إنجاز هذا بواسطة صراحة يمر في الفترة الحالية ملزمة:

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

a = 5
func(:a, binding)
puts a # => 6

نصائح أخرى

روبي لا يدعم "تمر بها المرجعية" على الإطلاق.كل ما هو كائن و الإشارة إلى هذه الأشياء هي دائما تمريرها حسب القيمة.في الواقع, في المثال الخاص بك يتم تمرير نسخة من الإشارة إلى Fixnum وجوه من حيث القيمة.

المشكلة مع التعليمات البرمجية الخاصة بك ، x += 1 لا تعديل مرت Fixnum كائن ولكن بدلا من ذلك يخلق جديد تماما ومستقلة الكائن.

أعتقد جافا المبرمجين استدعاء Fixnum الكائنات غير قابل للتغيير.

في روبي لا يمكنك تمرير المعلمات من قبل المرجعية.على سبيل المثال الخاص بك, سيكون لديك للعودة قيمة جديدة و تعيين إلى متغير أو إنشاء فئة جديدة تحتوي على قيمة وتمرير مثيل من هذه الفئة في جميع أنحاء.على سبيل المثال:

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