मैं रूबी में एक पंक्ति पर एक विधि को कैसे परिभाषित करूं?


92

क्या def greet; puts "hello"; endरूबी में एक लाइन पर एक विधि को परिभाषित करने का एकमात्र तरीका है?


11
जैसा कि आप उत्तरों से देख सकते हैं, किसी एक लाइन पर अलग-अलग तरीकों को परिभाषित करना संभव है, लेकिन सवाल यह है कि क्या आपको चाहिए? किसी भी परिभाषा को ऐसे तरीके से लिखा जाना चाहिए जो रखरखाव और पठनीयता के कारणों के लिए स्पष्ट और साफ हो, इसलिए यदि एकल-रेखा अनिर्दिष्ट या भ्रामक हो जाए तो उसे बाहर फैलाएं। कुछ भाषाओं को कोड-स्टडी होने के तरीके के रूप में ट्रिक कोडिंग को प्रोत्साहित करना प्रतीत होता है, लेकिन रूबी कोडिंग शैली अध्ययनशीलता से ऊपर लालित्य, पठनीयता और स्थिरता को प्रोत्साहित करती है। पहले तीन को पूरा करें और हम आपको नमन करेंगे।
टिन मैन

जवाबों:


102

यदि आप कोष्ठक का उपयोग करते हैं तो आप अर्धविराम का उपयोग करने की आवश्यकता से बच सकते हैं:

def hello() :hello end

1
यह अर्धविराम का उपयोग करने से अधिक लंबा है ...?
अपोलिस

73

बस पूरा ताजा जवाब दें:

सामान्य तौर पर सिंगल-लाइन विधियों से बचें। हालाँकि वे जंगली में कुछ लोकप्रिय हैं, फिर भी उनकी परिभाषा के बारे में कुछ ख़ासियतें हैं जो उनके उपयोग को अवांछनीय बनाती हैं। किसी भी दर पर - एकल-पंक्ति पद्धति में एक से अधिक अभिव्यक्ति नहीं होनी चाहिए ।

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

नियम का एक अपवाद खाली-शरीर के तरीके हैं।

# good
def no_op; end

से bbatsov / माणिक शैली गाइड


39
def add a,b; a+b end

अर्धविराम रूबी के लिए इनलाइन स्टेटमेंट टर्मिनेटर है

या आप define_methodविधि का उपयोग कर सकते हैं । (संपादित करें: यह एक माणिक 1.9 में दर्शाया गया है)

define_method(:add) {|a,b| a+b }

4
लगता है रूबी 2 +
15

9

दूसरा रास्ता:

define_method(:greet) { puts 'hello' }

यदि आप इसे परिभाषित करते समय विधि के लिए नए दायरे में प्रवेश नहीं करना चाहते हैं तो इसका उपयोग किया जा सकता है


NoMethodError: निजी विधि `डिफाइन_मिथोड 'ऑब्जेक्ट के लिए कहा जाता है: रूबी में कक्षा 1.9.3
जेरेड

3
define_methodरूबी 1.9 में "निजीकरण" किया गया है
एडगरनर

8

अभी तक एक और तरीका:

def greet() return 'Hello' end

12
रूबी में, किसी विधि का रिटर्न मान अंतिम विवरण द्वारा दिया गया मान होता है। returnगार्ड क्लॉज न होने से आपको यहां की जरूरत नहीं है।
डेमियन

1
अपवित्र क्योंकि, इसकी आवश्यकता नहीं है , लेकिन returnरूबी में (या परिचित) से कम छंदों के लिए पठनीयता जोड़ सकते हैं। यह उन YMMV चीजों में से एक है ...
Potherca
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.