"হিমশীতল_তারকা_সূচি: সত্য" মন্তব্যটি কী করে?


226

এটি rspecআমার প্রকল্প ডিরেক্টরিতে বিনস্টাব।

#!/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রুবি ২.৩-এ প্রথমবারের জন্য সমর্থিত একটি যাদু মন্তব্য, যা রুবিকে জানায় যে ফাইলের সমস্ত স্ট্রিং লিটারিয়াল স্পষ্টভাবে হিমায়িত, যেন #freezeতাদের প্রত্যেককে ডেকে আনা হয়েছিল। এটি হ'ল যদি এই মন্তব্যের সাথে কোনও ফাইলে কোনও স্ট্রিং আক্ষরিক সংজ্ঞায়িত করা হয় এবং আপনি সেই স্ট্রিংয়ের কোনও পদ্ধতি কল করেন যা এটির সংশোধন করে, যেমন <<, আপনি পাবেন RuntimeError: can't modify frozen String

মন্তব্যটি অবশ্যই ফাইলের প্রথম লাইনে থাকতে হবে।

রুবি ২.৩-তে, আপনি এই ম্যাজিক মন্তব্যটি হ'ল রুবির 3 এ ডিফল্ট হিমায়িত স্ট্রিং লিটারেলের জন্য প্রস্তুত করতে পারেন ।

রুবিতে --enable=frozen-string-literalপতাকাটি দিয়ে রান করুন ২.৩ এবং রুবি ৩ তে স্ট্রিং লিটারালগুলি সমস্ত ফাইলে হিমশীতল। আপনি এর মাধ্যমে বিশ্বব্যাপী সেটিংসকে ওভাররাইড করতে পারেন # frozen_string_literal: false

আপনি যদি বিশ্বব্যাপী বা প্রতি-ফাইলের সেটিং নির্বিশেষে কোনও স্ট্রিং আক্ষরিককে পরিবর্তন করতে চান তবে আপনি এটি আনারি +অপারেটরের (অপারেটর অগ্রাধিকারের সাথে সাবধানতা অবলম্বন করে) উপসর্গ করতে পারেন বা কল .dupকরতে পারেন:

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

আপনি unary সঙ্গে একটি পরিবর্তনীয় (হিমায়িত) স্ট্রিং স্থির করতে পারেন -


24
ফ্রিজিং স্ট্রিং সম্পর্কিত গুরুত্বপূর্ণ বিষয়টি এটি অ্যাপটির কার্যকারিতা উন্নত করেএখানে
আন্দ্রেস এহরনপ্রেসিস

2
@ dave-schweisguth আমাদের কি -"foo"একইরকম হওয়ার আশা করা উচিত নয় "foo".freeze? আমি যখন যাচাই (-"foo").__id__করি প্রতিবার একটি আলাদা মান পাই তবে "foo".freeze.__id__প্রতিবার একই same কোন ধারনা?
লিলোলে

আমি ভাবছি যদি এই ফাংশনটি সমস্যা হয় তবে এটি কেবল অ্যানারি বিয়োগের সাথে ডাকা হবে বলে মনে হচ্ছে। github.com/ruby/ruby/blob/trunk/string.c#L2572
লিলোলে

2
-হিমায়িত স্ট্রিং ফিরিয়ে দেওয়ার সাথে সাথে মেমরি বাঁচাতে স্ট্রিংটি নকল করার জন্য।
Eregon

9
আপনি এখনও যাদু মন্তব্য ব্যবহার করতে পারেন, মাত্জ আনুষ্ঠানিকভাবে রুবি 3 এ ডিফল্টভাবে সমস্ত স্ট্রিং লিটারালকে
কনস্টান্টিন টিখোনভ

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

২. স্ট্রিং লিটারালগুলিকে হিমায়িত করে স্ট্রিং আক্ষরিক পরিবর্তনের চেষ্টা করার সময় আপনার প্রোগ্রামটি একটি ব্যতিক্রম বাড়িয়ে তুলবে।

উদাহরণ:

যাদু মন্তব্য ছাড়াই , আপনি স্ট্রিং লিটারেলগুলি সংশোধন করতে পারেন।

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

রুবি ৩.০ এ ম্যাটজ (রুবির স্রষ্টা) সমস্ত স্ট্রিং আক্ষরিককে ডিফল্টরূপে হিমায়িত করার সিদ্ধান্ত নিয়েছে।

আপনি রুবি ২.x ব্যবহার করতে পারেন। আপনার ফাইলগুলির প্রথম লাইনে এই মন্তব্যটি যুক্ত করুন।

# frozen_string_literal: true

কোনও ফাইলের শীর্ষের উপরের মন্তব্যটি ফাইলের স্ট্যাটিক স্ট্রিংয়ের আক্ষরিক শব্দার্থের পরিবর্তন করে। স্ট্যাটিক স্ট্রিং লিটারালগুলি হিমশীতল হবে এবং সর্বদা একই বস্তুটি ফেরত দেবে। (গতিশীল স্ট্রিং লিটারালসের শব্দার্থবিজ্ঞান পরিবর্তন করা হয়নি))

এই উপায়ের নিম্নলিখিত সুবিধা রয়েছে:

কোনও কুৎসিত এফ-প্রত্যয় নেই। পুরানো রুবির কোনও সিনট্যাক্স ত্রুটি নেই। আমাদের প্রতিটি ফাইলের জন্য একটি লাইন প্রয়োজন।

দয়া করে, আরও তথ্যের জন্য এই বিষয়টি পড়ুন।

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


দুর্ভাগ্যক্রমে এই মন্তব্য অ্যারে স্ট্রিংয়ের জন্য কাজ করে না, তাই তাদের এখনও স্পষ্টভাবে
হিমায়িত

3
দুর্ভাগ্যক্রমে এটি রুবি 3 বাগে
রবি-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.