YAML: मैं YAML में तार के लिए उद्धरण की आवश्यकता है?


398

मैं एक रेल परियोजना के अंतर्राष्ट्रीयकरण के लिए एक YAML शब्दकोश लिखने की कोशिश कर रहा हूं। मैं थोड़ा उलझन में हूं, क्योंकि कुछ फाइलों में मुझे डबल-कोट्स में स्ट्रिंग्स दिखती हैं और कुछ में बिना। विचार करने के लिए कुछ बिंदु:

  • उदाहरण 1 - सभी तार दोहरे उद्धरण चिह्नों का उपयोग करते हैं;
  • उदाहरण 2 - कोई तार नहीं (अंतिम दो को छोड़कर) उद्धरण का उपयोग करें;
  • YAML रसोई की किताब का कहना है: दोहरे उद्धरण में तार संलग्न आप escapings उपयोग करने के लिए ASCII और यूनिकोड वर्ण का प्रतिनिधित्व करने की अनुमति देता है। क्या इसका मतलब है कि मुझे दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता है जब मैं कुछ पात्रों से बचना चाहता हूं? यदि हाँ - तो वे पहले उदाहरण में हर जगह दोहरे उद्धरणों का उपयोग क्यों करते हैं - केवल एकता / शैलीगत कारणों के लिए?
  • उदाहरण 2 की अंतिम दो पंक्तियाँ !- गैर-विशिष्ट टैग, जबकि पहले उदाहरण की अंतिम दो पंक्तियाँ नहीं - और वे दोनों काम करती हैं।

मेरा सवाल यह है: YAML में विभिन्न प्रकार के उद्धरणों का उपयोग करने के नियम क्या हैं?

क्या यह कहा जा सकता है कि:

  • सामान्य तौर पर, आपको उद्धरण चिह्नों की आवश्यकता नहीं है;
  • यदि आप पात्रों से बचना चाहते हैं तो दोहरे उद्धरण चिह्नों का उपयोग करें;
  • !एकल उद्धरण के साथ प्रयोग करें, जब ...?!?

1
दूसरा लिंक अब काम नहीं कर रहा है, मैं आपके उदाहरणों को सवाल में डालने का सुझाव देता हूं।
हेरोइन

जवाबों:


565

YAML रसोई की किताब की संक्षिप्त समीक्षा के बाद सवाल और कुछ परीक्षण में उद्धृत, यहाँ मेरी व्याख्या है:

  • सामान्य तौर पर, आपको उद्धरण चिह्नों की आवश्यकता नहीं होती है।
  • एक स्ट्रिंग को मजबूर करने के लिए उद्धरणों का उपयोग करें, उदाहरण के लिए यदि आपकी कुंजी या मूल्य है, 10लेकिन आप चाहते हैं कि यह एक स्ट्रिंग लौटाए और फ़िक्नम नहीं, लिखें '10'या "10"
  • का प्रयोग करें उद्धरण यदि आपका मूल्य विशेष वर्ण शामिल हैं (उदाहरण के लिए :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \)।
  • एकल उद्धरण आपको अपनी स्ट्रिंग में लगभग किसी भी वर्ण को रखने देते हैं, और कोड से बचने की कोशिश नहीं करेंगे। '\n'स्ट्रिंग के रूप में वापस किया जाएगा \n
  • डबल उद्धरण पार्स एस्केप कोड। "\n"एक पंक्ति फ़ीड चरित्र के रूप में लौटा दी जाएगी।
  • विस्मयादिबोधक चिह्न एक विधि का परिचय देता है, उदाहरण के !ruby/symलिए एक रूबी प्रतीक।

मुझे लगता है कि सबसे अच्छा तरीका है कि जब तक आप विशेष रूप से भागने के कोड को संसाधित नहीं करना चाहते हैं, तब तक उद्धरण का उपयोग न करें और तब तक एकल उद्धरण का उपयोग न करें।

अपडेट करें

"हां" और "नहीं" को उद्धरणों (एकल या दोहरे) में संलग्न किया जाना चाहिए अन्यथा उन्हें TrueClass और FalseClass मान के रूप में व्याख्या किया जाएगा:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'

16
यह पूरी तस्वीर नहीं है। उदाहरण के लिए, @और `को शुरुआत में छोड़कर एक सादे स्ट्रिंग में कहीं भी इस्तेमाल किया जा सकता है, क्योंकि वे आरक्षित संकेतक हैं
एडम स्पियर्स

19
मैं पूरी तस्वीर प्रदान करने की कोशिश नहीं कर रहा था, बस अंगूठे के कुछ नियम। हां, यह कभी-कभी ऐसा लगता है, कुछ विशेष वर्णों (आरक्षित संकेतक) को उद्धरण के बिना उपयोग किया जा सकता है (जब तक कि एक आरक्षित सूचक एक सादा स्केलर शुरू नहीं करता है), लेकिन जब भी आप एक विशेष चरित्र देखते हैं तो उद्धरणों का उपयोग करना गलत नहीं है।
मार्क बेरी

33
YAML में तार के नियम बहुत जटिल हैं, क्योंकि बहुत सारे प्रकार के तार हैं। मैंने यहां एक तालिका लिखी: stackoverflow.com/questions/3790454/…
स्टीव बेनेट

56
इन सभी घटनाओं को देखते हुए, मैं सिर्फ हर जगह उद्धरण का उपयोग करता हूं: - /
विक्की चिजवानी

6
इसके अलावा, यहाँ एक पूरा संदर्भ मैंने लिखा है: blogs.perl.org/users/tinita/2018/03/…
tinita

0

डॉकर के साथ रेल एप्लिकेशन पर काम करते समय मुझे यह चिंता थी ।

मेरा सबसे पसंदीदा तरीका आमतौर पर उद्धरणों का उपयोग नहीं करना है। इसके लिए उद्धरणों का उपयोग नहीं करना शामिल है :

  • चर जैसे ${RAILS_ENV}
  • एक बृहदान्त्र (:) की तरह अलग मूल्यों postgres-log:/var/log/postgresql
  • अन्य तार मान

हालाँकि, मैं integerउन मानों के लिए दोहरे-उद्धरणों का उपयोग करता हूं जिन्हें स्ट्रिंग्स में बदलने की आवश्यकता है:

  • docker- कम्पोज़ संस्करण version: "3.8"
  • पोर्ट नंबर की तरह "8080:8080"

हालांकि, विशेष मामलों की तरह के लिए booleans, floats, integers, और अन्य मामलों में, जहां प्रवेश मूल्यों के लिए डबल उद्धरण का उपयोग कर के रूप में व्याख्या की जा सकती strings, तो कृपया नहीं का उपयोग डबल उद्धरण।

docker-compose.ymlइस अवधारणा को समझाने के लिए एक नमूना फ़ाइल यहाँ दी गई है :

version: "3"

services:
  traefik:
    image: traefik:v2.2.1
    command:
      - --api.insecure=true # Don't do that in production
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

बस इतना ही।

आशा है कि ये आपकी मदद करेगा

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