'تمرير المعلمة بالإشارة' في روبي ؟
-
03-07-2019 - |
سؤال
في روبي ، هل من الممكن أن يمر بها إشارة معلمة مع قيمة من نوع دلالات (مثلا ، أ 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"}