टिप्पणी "जमे हुए_स्ट्रिंग_लिटरल: सच" क्या करती है?


226

यह rspecमेरी परियोजना निर्देशिका में binstub है।

#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'rspec' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rspec-core", "rspec")

यह करने का इरादा क्या है?

# frozen_string_literal: true

जवाबों:


314

# frozen_string_literal: trueरूबी 2.3 में पहली बार समर्थित एक जादुई टिप्पणी है, जो रूबी को बताती है कि फ़ाइल में सभी स्ट्रिंग शाब्दिक रूप से जमे हुए हैं, जैसे कि #freezeउनमें से प्रत्येक पर कॉल किया गया था। यही है, अगर एक स्ट्रिंग शाब्दिक इस टिप्पणी के साथ एक फ़ाइल में परिभाषित किया गया है, और आप उस स्ट्रिंग पर एक विधि कहते हैं जो इसे संशोधित करता है, जैसे कि <<, आपको मिलेगा RuntimeError: can't modify frozen String

टिप्पणी फ़ाइल की पहली पंक्ति पर होनी चाहिए।

रूबी 2.3 में, आप इस जादुई टिप्पणी का उपयोग रूबी 3 में जमे हुए स्ट्रिंग शाब्दिकों के डिफ़ॉल्ट होने के लिए कर सकते हैं ।

रूबी में 2.3 --enable=frozen-string-literalध्वज के साथ चलते हैं , और रूबी 3 में, स्ट्रिंग शाब्दिक सभी फाइलों में जमे हुए हैं। आप के साथ वैश्विक सेटिंग को ओवरराइड कर सकते हैं # frozen_string_literal: false

यदि आप चाहते हैं कि कोई स्ट्रिंग शाब्दिक वैश्विक या प्रति-फ़ाइल सेटिंग की परवाह किए बिना परिवर्तनशील हो, तो आप इसे अपर +संचालक (ऑपरेटर पूर्वता से सावधान रहना) या .dupउस पर कॉल कर सकते हैं:

# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false

आप एक उत्परिवर्तित (अनफ्रोजेन) स्ट्रिंग को भी एकजुट कर सकते हैं -


24
फ्रीजिंग स्ट्रिंग्स के संबंध में महत्वपूर्ण बात यह है कि यह ऐप के प्रदर्शन को बेहतर बनाता हैयहां
एंड्रेस एहरनपेरिस

2
@ dave-schweisguth क्या हमें -"foo"वैसा ही होने की उम्मीद नहीं करनी चाहिए "foo".freeze? जब मैं जांच करता हूं तो (-"foo").__id__मुझे हर बार एक अलग मूल्य मिलता है, लेकिन "foo".freeze.__id__हर बार समान होता है। कोई विचार?
lilole

मुझे आश्चर्य है कि यदि यह कार्य मुद्दा है, तो यह केवल शून्य से शून्य के साथ बुलाया जाना प्रतीत होता है। github.com/ruby/ruby/blob/trunk/string.c#L2572
lilole

2
-फ्रिंज स्ट्रिंग को वापस करने के अलावा, मेमोरी को बचाने के लिए स्ट्रिंग को कम करने के लिए है।
ेरेगॉन

9
जब आप अभी भी जादू की टिप्पणी का उपयोग कर सकते हैं, तो मात्ज़ ने आधिकारिक तौर पर रूबी 3: Bugs.ruby-lang.org/issues/11473#note-53
कोन्स्टेंटिन

43

यह एक ही स्ट्रिंग के लिए नई जगह आवंटित नहीं करके आवेदन प्रदर्शन में सुधार करता है, जिससे कचरा संग्रह के कामों के लिए समय की भी बचत होती है। कैसे? जब आप एक स्ट्रिंग शाब्दिक (स्ट्रिंग ऑब्जेक्ट) को फ्रीज करते हैं, तो आप रूबी से कह रहे हैं कि अपने किसी भी प्रोग्राम को स्ट्रिंग शाब्दिक (ऑब्जेक्ट) को संशोधित न करने दें।

कुछ स्पष्ट टिप्पणियों को ध्यान में रखना।

1. स्ट्रिंग स्ट्रिंग को फ्रीज़ करके, आप इसके लिए नई मेमोरी स्पेस आवंटित नहीं कर रहे हैं।

उदाहरण:

जादू की टिप्पणी के बिना एक ही स्ट्रिंग के लिए नई जगह आवंटित करता है (मुद्रित अलग ऑब्जेक्ट आईडी का निरीक्षण करें)

def hello_id
  a = 'hello'
  a.object_id
end

puts hello_id   #=> 70244568358640
puts hello_id   #=> 70244568358500

जादू की टिप्पणी के साथ , माणिक केवल एक बार अंतरिक्ष आवंटित करता है

# frozen_string_literal: true

def hello_id
  a = 'hello'
  a.object_id
end

puts hello_id   #=> 70244568358640
puts hello_id   #=> 70244568358640

2. स्ट्रिंग शाब्दिकों को फ्रीज़ करके, आपका प्रोग्राम एक अपवाद बढ़ाएगा जब स्ट्रिंग शाब्दिक को संशोधित करने की कोशिश की जाएगी।

उदाहरण:

जादू की टिप्पणी के बिना , आप स्ट्रिंग शाब्दिक को संशोधित कर सकते हैं।

name = 'Johny'
name << ' Cash'

puts name     #=> Johny Cash

जादू की टिप्पणी के साथ , जब आप स्ट्रिंग शाब्दिकों को संशोधित करते हैं तो एक अपवाद उठाया जाएगा

# frozen_string_literal: true

name = 'john'
name << ' cash'  #=> `<main>': can't modify frozen String (FrozenError)

puts name      

सीखने और लचीले होने के लिए हमेशा अधिक होता है:


यह अधिक सहज उत्तर है।
जिन लिम

20

रूबी में 3.0। Matz (रूबी के निर्माता) ने सभी स्ट्रिंग शाब्दिक को डिफ़ॉल्ट रूप से जमे हुए बनाने का निर्णय लिया।

आप रूबी 2.x में उपयोग कर सकते हैं। इस टिप्पणी को अपनी फ़ाइलों की पहली पंक्ति में जोड़ें।

# frozen_string_literal: true

फ़ाइल के शीर्ष पर उपरोक्त टिप्पणी फ़ाइल में स्थिर स्ट्रिंग शाब्दिकों के शब्दार्थ को बदलती है। स्थिर स्ट्रिंग लिटरल जमे हुए होंगे और हमेशा एक ही वस्तु को लौटाएंगे। (गतिशील स्ट्रिंग शाब्दिकों का शब्दार्थ नहीं बदला गया है।)

इस तरह से निम्नलिखित लाभ हैं:

कोई बदसूरत एफ-प्रत्यय नहीं। पुराने रूबी पर कोई सिंटैक्स त्रुटि नहीं। हमें प्रत्येक फ़ाइल के लिए केवल एक पंक्ति चाहिए।

अधिक जानकारी के लिए, इस विषय को पढ़ें।

https://bugs.ruby-lang.org/issues/8976


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

3
दुर्भाग्य से यह रूबी में नहीं होगा 3 Bugs.ruby-lang.org/issues/11473#note-53
zhisme
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.