2008-10-02 7 views
25

रुबी में, क्या मूल्य-प्रकार अर्थशास्त्र (उदा। एक फिक्सम) के साथ पैरामीटर संदर्भित करना संभव है? मैं सी # के 'रेफ' कीवर्ड के समान कुछ ढूंढ रहा हूं।'संदर्भ द्वारा पास पैरामीटर'?

उदाहरण:

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) 

उत्तर

30

आप स्पष्ट रूप से वर्तमान बंधन में पास करके यह पूरा कर सकते हैं:

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

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

क्या यह धागा सुरक्षित है? – Dex

18

रूबी "संदर्भ द्वारा पास" का समर्थन नहीं करता है। सब कुछ एक वस्तु है और उन वस्तुओं के संदर्भ हमेशा मूल्य से पारित होते हैं। असल में, आपके उदाहरण में आप मूल्य के अनुसार Fixnum ऑब्जेक्ट के संदर्भ की एक प्रति पास कर रहे हैं।

आपके कोड के साथ समस्या यह है कि x += 1 उत्तीर्ण Fixnum ऑब्जेक्ट को संशोधित नहीं करता है बल्कि इसके बजाय पूरी तरह से नई और स्वतंत्र वस्तु बनाता है।

मुझे लगता है कि जावा प्रोग्रामर Fixnum ऑब्जेक्ट्स अपरिवर्तनीय पर कॉल करेंगे।

+3

मुझे यह बात नहीं मिलती है कि रूबी रेफरी से गुजरती नहीं है, जब चर और पैरामीटर में केवल ऑब्जेक्ट्स के संदर्भ हो सकते हैं। यह कहकर कि मूल्यों द्वारा संदर्भ पारित किए गए हैं, यह कहकर समान है कि वस्तुओं को संदर्भ द्वारा पारित किया जाता है। –

+2

@ डेमियन: नहीं, यह नहीं है। संदर्भ द्वारा पास करें (उदा। सी ++, सी #, पीएचपी, पर्ल में) आपको वैरिएबल को * असाइन करने की अनुमति देता है जैसे कि आपने बाहरी दायरे में इसे असाइन किया है। आप यहां क्या करने की कोशिश कर रहे हैं संदर्भ के साथ सही पास के साथ संभव होगा; लेकिन संदर्भों के मूल्य से गुजरने के साथ नहीं। – newacct

+6

आप सही हैं, मैं क्रिस्टोफ के जवाब और मेरी टिप्पणी फिर से पढ़ रहा हूं और मैं अपने 200 9 से सहमत नहीं हूं। हम्म ... –

10

रूबी में आप संदर्भ द्वारा पैरामीटर पास नहीं कर सकते। आपके उदाहरण के लिए, आपको नया मान वापस करना होगा और उसे वैरिएबल को असाइन करना होगा या एक नई कक्षा बनाना होगा जिसमें मूल्य शामिल है और इस कक्षा के उदाहरण को पास करें। उदाहरण:

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 
6

आप चाल निम्नलिखित कोशिश कर सकते हैं:

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' 
+0

हाँ, यह –

+0

काम करता है तकनीकी रूप से यह लिखने पर परिवर्तनीय (और सूची में संदर्भ) को भी बदल रहा है। – itarato

2

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

Fixnum वस्तुओं तत्काल मूल्य की है। इसका अर्थ यह है कि जब उन्हें असाइन किया जाता है या पैरामीटर के रूप में पारित किया जाता है, तो ऑब्जेक्ट के संदर्भ के बजाय वास्तविक वस्तु पारित की जाती है।

भी Ruby is pass by value