Text
Page: 1
How to specify
frozen_string_literal: true
Kazuhiro NISHIYAMA
RubyKaigi 2017 LT
2017/09/19
Powered by Rabbit 2.2.1
Page: 2
self.introduce
One of Ruby committers
Twitter, GitHub: @znz
1/12
Page: 3
What’s frozen_string_literal
magic comment
Specify string literals are frozen or not per fle
Frozen string literals are faster
Generate less objects
Reduce GC
2/12
Page: 4
Example
After coding if exist
example:
# -*- coding: utf-8 -*-
# frozen_string_literal: true
p ''.frozen? #=> true
3/12
Page: 5
Past release
Add frozen_string_literal: false for almost
*.rb fles when Ruby 2.3.0
For compatibility with --enable=frozen-string-
literal command line option of ruby
4/12
Page: 6
Changes in this year
Recent Ruby programs tend to specify true, but
ruby standard libraries are false.
So I changed to frozen_string_literal: true in
some fles which assigned to no maintainer in doc/
maintainers.rdoc.
5/12
Page: 7
Review points before change
Almost RuntimeError: can't modify frozen String
points are:
String#<<
bang methods (e.g. String#sub!)
6/12
Page: 8
Overlooked modifcation
IO#read(length, out_buffer)
this buffer is overlooked
7/12
Page: 9
Find modifed string literal
--debug=frozen-string-literal command line
option is very useful
examples:
ruby --debug=frozen-string-literal test.rb
make test-all TESTS='-v base64' RUBYOPT=--debug=frozen-string-literal
8/12
Page: 10
Tests
--debug=frozen-string-literal needs to run
codes.
So tests are very important.
9/12
Page: 11
No change if can’t
If no tests, there is no need to forcibly change it.
I think working codes are useful than broken
faster codes.
10/12
Page: 12
mkmf.rb
mkmf.rb has many tests
But mkmf.rb is too complex to me in a short time
So I remain false
11/12
Page: 13
Conclusion
No tests may overlook modifcations
Use frozen_string_literal: true if you can
You can use frozen_string_literal: false in
some cases for compatibility for --enable=frozen-
string-literal
Powered by Rabbit 2.2.1
12/12