एक लाइन अगर बयान काम नहीं कर रहा है


191
<%if @item.rigged %>Yes<%else%>No<%end%>

मैं ऐसा ही कुछ सोच रहा था?

if @item.rigged ? "Yes" : "No" 

लेकिन यह काम नहीं करता है। रूबी के पास है, ||=लेकिन मुझे यकीन नहीं है कि उस चीज़ का उपयोग कैसे करना है।


यह स्पष्ट नहीं है कि कौन सी रेखा काम नहीं कर रही है (या यह दोनों है?)
ymoreau

जवाबों:


399

निकालें ifसेif @item.rigged ? "Yes" : "No"

टर्नरी ऑपरेटर के पास फॉर्म है condition ? if_true : if_false


1
यदि आप हालत 'में समाप्त हो?' क्या इसे गिराना संभव है? यानी अगर हालत @ customer.sales.pret है? क्या आप 'छोड़ सकते हैं?' ... चिंता मत करो। कुछ कोड मुझे मिले और मैंने उसका परीक्षण किया। जवाब है 'नहीं'
जय किलेन

@ जयकेलेन आप सही हैं। रूबी चतुर चाल के बारे में सभी है, लेकिन यह है कि चतुर (:
निकिता रयबाक

1
@ निकितारिबक s/that/not that :)
ऑस्टिन

180

रूबी में, स्थिति और अभिव्यक्ति के thenहिस्से को ifएक अभिव्यक्ति विभाजक (यानी ;या एक नई पंक्ति) या thenकीवर्ड द्वारा अलग किया जाना चाहिए ।

तो, ये सभी काम करेंगे:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

रूबी में एक सशर्त ऑपरेटर भी है, लेकिन यह पूरी तरह से अनावश्यक है। सशर्त ऑपरेटर, सी में की जरूरत है क्योंकि यह एक ऑपरेटर है: सी में, ifएक मूल्य वापस नहीं लौट सकते एक बयान है और इस तरह, इसलिए यदि आप एक मूल्य के वापस जाने के लिए चाहते हैं, आप जो कुछ उपयोग करने की आवश्यकता कर सकते हैं कोई मान। और सी में एकमात्र चीजें जो एक मान लौटा सकती हैं वे फ़ंक्शन और ऑपरेटर हैं, और चूंकि ifसी में फ़ंक्शन करना असंभव है, इसलिए आपको एक ऑपरेटर की आवश्यकता है।

रूबी में, हालांकि, ifएक अभिव्यक्ति है। वास्तव में, रूबी में सब कुछ एक अभिव्यक्ति है, इसलिए यह पहले से ही एक मूल्य वापस कर सकता है। सशर्त ऑपरेटर को यहां तक ​​कि मौजूद रहने की कोई आवश्यकता नहीं है , अकेले इसका उपयोग करें।

BTW: यह नाम विधियों का प्रथागत है, जिनका उपयोग प्रश्न चिह्न के साथ अंत में प्रश्न पूछने के लिए किया जाता है, जैसे:

@item.rigged?

यह रूबी में सशर्त ऑपरेटर का उपयोग करने के साथ एक और समस्या दिखाता है:

@item.rigged? ? 'Yes' : 'No'

एक-दूसरे के करीब कई सवालिया निशान पढ़ना मुश्किल है।


74

एक पंक्ति यदि:

<statement> if <condition>

आपका मुकदमा:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
या "No" unless @item.riggedरोकने के लिए!
20:13 पर वीर

यह समाधान में यह रिटर्न कि अलग है nilके बजाय 'Yes'अगर item.riggedसच है। nilयदि शर्त पूरी नहीं होती है तो एकल-पंक्ति या जब तक कि बयान वापस नहीं आते हैं।
पेलमिस्टर

23

जो मुझे पता है

3 एक-लाइनर

  1. a = 10 if <condition>

उदाहरण:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

उदाहरण:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

उदाहरण:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

मुझे उम्मीद है यह मदद करेगा।


2
डॉग यह सबसे अच्छा जवाब है - मुझे प्यार है कि यह तीनों तरीकों के विपरीत है। धन्यवाद!
मि।

7

दोनों शेल और सी एक-लाइन निर्माण कार्य (रूबी 1.9.3p429):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

केवल दूसरा उदाहरण मुहावरेदार रूबी है
sekmo


2

यदि आप उपयोग कर सकते हैं तो सादगी के लिए, यदि आपको कुछ मूल्य के लिए डिफ़ॉल्ट करने की आवश्यकता है:

@something.nil? = "No" || "Yes"

1

आप उपयोग कर सकते हैं ----

(@ item.rigged)? "हाँ नही"

यदि @ आइटम.ग्रेस्ड सत्य है, तो वह 'हां' लौटाएगा, अन्यथा वह 'नहीं' लौटाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.