Ini adalah rspec
binstub di direktori proyek saya.
#!/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")
Apa yang ingin dilakukan?
# frozen_string_literal: true
sumber
-"foo"
seharusnya sama dengan"foo".freeze
? Ketika saya memeriksa(-"foo").__id__
saya mendapat nilai yang berbeda setiap kali, tetapi"foo".freeze.__id__
sama setiap kali. Ada ide?-
adalah untuk mendupuplikasi String untuk menghemat memori, selain mengembalikan String yang beku.Ini meningkatkan kinerja aplikasi dengan tidak mengalokasikan ruang baru untuk string yang sama, sehingga juga menghemat waktu untuk pekerjaan pengumpulan sampah. Bagaimana? ketika Anda membekukan string literal (objek string), Anda memberi tahu Ruby untuk tidak membiarkan program Anda memodifikasi string literal (objek).
Beberapa pengamatan jelas perlu diingat.
1. Dengan membekukan string literal, Anda tidak mengalokasikan ruang memori baru untuk itu.
Contoh:
Tanpa komentar ajaib mengalokasikan ruang baru untuk string yang sama (Amati berbagai objek ID yang dicetak)
Dengan komentar ajaib , ruby mengalokasikan ruang hanya sekali
2. Dengan membekukan string literal, program Anda akan memunculkan eksepsi ketika mencoba untuk memodifikasi string literal.
Contoh:
Tanpa komentar ajaib , Anda dapat memodifikasi string literal.
Dengan komentar ajaib , pengecualian akan dimunculkan ketika Anda memodifikasi string literal
Selalu ada lagi yang harus dipelajari dan fleksibel:
sumber
Di Ruby 3.0. Matz (pembuat Ruby) memutuskan untuk membuat semua String literal dibekukan secara default.
Anda dapat menggunakan di Ruby 2.x. Cukup tambahkan komentar ini di baris pertama file Anda.
Silakan, baca topik ini untuk informasi lebih lanjut.
https://bugs.ruby-lang.org/issues/8976
sumber