Jan 20, 2021 2021-01-20T07:00:00+00:00 by Phuc Thai
Updated Aug 29, 2021 2021-08-29T09:24:37+00:00 1 min
Khi dùng rubocop trong Rails, chúng ta thường bị bắt lỗi # frozen_string_literal: true
. Vậy frozen_string_literal
dùng để làm gì?
Frozen_string_literal là gì ?
# frozen_string_literal: true
là 1 trong những magic comments được support từ ruby 2.3 dùng để cải thiện performance bằng việc chỉ cấp 1 vùng nhớ dựa vào nội dung của mỗi chuỗi, nghĩa là với những chuỗi có nội dung giống nhau thì sẽ chỉ thuộc về 1 vùng nhớ , tương tự với Symbol. Bằng cách thông báo với Ruby rằng bạn đã “freeze string literal (string object)” thì Ruby sẽ không để cho bất cứ thứ gì có thể chỉnh sửa chuỗi ký tự đó.
Demo
Frozen_string_literal: true
- Cấp 1 vùng nhớ dựa vào nội dung của mỗi chuỗi
1
2
3
4
5
6
| # frozen_string_literal: true
p 'key'.object_id # => 70306598556120
p 'key'.object_id # => 70306598556120
a = 'hello'; p a.object_id # => 47326081372960
b = 'hello'; p b.object_id # => 47326081372960
|
- Ngăn chặn việc thay đổi chuỗi kí tự
1
2
3
4
| # frozen_string_literal: true
str = 'hello'
str << ' world'
puts str #=> `<main>': can't modify frozen String (FrozenError)
|
Frozen_string_literal: false
- Luôn cấp vùng nhớ mới cho mỗi string
1
2
3
4
5
6
| # frozen_string_literal: false
p 'key'.object_id # => 47452453679760
p 'key'.object_id # => 47452453679620
a = 'hello'; p a.object_id # => 47452453679540
b = 'hello'; p b.object_id # => 47452453679520
|
1
2
3
4
| # frozen_string_literal: false
str = 'hello'
str << ' world'
puts str # => hello world
|
Note: Nhưng nếu dùng # frozen_string_literal: true
mà vẫn muốn thay đổi được thì hãy dùng hàm dup. Ví dụ:
1
2
3
4
5
6
| # frozen_string_literal: true
p 'key'.object_id # => 47452453679760
p 'key'.dup.object_id # => 47452453679620
a = 'hello'; p a.object_id # => 47452453679540
b = 'hello'; p b.dup.object_id # => 47452453679520
|
Tổng kết
frozen_string_literal
làm giảm việc tạo rác (garbage), cải thiện performance.
Reference
- https://stackoverflow.com/a/55900180
- https://www.mikeperham.com/2018/02/28/ruby-optimization-with-one-magic-comment/