rabbit-slide-znz-frozen_string_literal 2017.01.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e31e579cd00677369848b11bed282e05ed1069af
4
+ data.tar.gz: 4b0885aaaef7ef7e6b9454097640f31276ae2859
5
+ SHA512:
6
+ metadata.gz: 4ff234bf29cf8b3c308b09230a2831cd038ebc70a656041fd0160845040fc4f568757462d18a90792772a4c3698aef202cf3f405162bd1d2288e0808ee25119d
7
+ data.tar.gz: d10bcf8609ddfa79df67d42589212198a1cabc28bb1f46edae05992d418759a93eacfbee601de6a5c304c9d1fbc528358f5b5c5667ae7a48ac7b61ec6993398b
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ frozen_string_literal.md
@@ -0,0 +1,23 @@
1
+ # `frozen_string_literal` の話
2
+
3
+ ruby 2.3.0 で追加された `frozen_string_literal` についてちょっと詳しく話します。
4
+
5
+ ## 作者向け
6
+
7
+ ### 表示
8
+
9
+ rake
10
+
11
+ ### 公開
12
+
13
+ rake publish
14
+
15
+ ## 閲覧者向け
16
+
17
+ ### インストール
18
+
19
+ gem install rabbit-slide-znz-frozen_string_literal
20
+
21
+ ### 表示
22
+
23
+ rabbit rabbit-slide-znz-frozen_string_literal.gem
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: frozen_string_literal
3
+ base_name: frozen_string_literal
4
+ tags:
5
+ - ruby
6
+ presentation_date: '2017-01-14'
7
+ version: 2017.01.14
8
+ licenses: []
9
+ slideshare_id: frozenstringliteral
10
+ speaker_deck_id: frozen-string-literal-falsehua
11
+ ustream_id:
12
+ vimeo_id:
13
+ youtube_id:
14
+ author:
15
+ markup_language: :markdown
16
+ name: Kazuhiro NISHIYAMA
17
+ email: zn@mbf.nifty.com
18
+ rubygems_user: znz
19
+ slideshare_user: znzjp
20
+ speaker_deck_user: znz
@@ -0,0 +1,295 @@
1
+ # `frozen_string_literal` の話
2
+
3
+ author
4
+ : Kazuhiro NISHIYAMA
5
+
6
+ content-source
7
+ : 第76回 Ruby関西 勉強会
8
+
9
+ date
10
+ : 2017-01-14
11
+
12
+ allotted-time
13
+ : 15m
14
+
15
+ # 自己紹介
16
+
17
+ - 西山和広
18
+ - id:znz (github, twitter など)
19
+ - Ruby コミッター
20
+
21
+ # `frozen_string_literal` とは?
22
+
23
+ - ruby 2.3.0 以降
24
+ - 文字列リテラルで生成される文字列を freeze されたものにする機能
25
+ - たとえば `''.frozen?` が `true` になる
26
+
27
+ # 使い方
28
+
29
+ - ファイルの頭にマジックコメント (ファイルごとに指定)
30
+
31
+ ```
32
+ # frozen_string_literal: true
33
+ ```
34
+
35
+ - 起動時のオプション (プロセス全体のデフォルトを指定)
36
+
37
+ ```
38
+ --enable=frozen_string_literal
39
+ ```
40
+
41
+ # 優先度
42
+
43
+ - 両方指定された場合はマジックコメント優先
44
+
45
+ # オプションの例
46
+
47
+ ```
48
+ % ruby --enable=frozen_string_literal \
49
+ -e 'p "".frozen?'
50
+ true
51
+ % ruby --disable=frozen_string_literal \
52
+ -e 'p "".frozen?'
53
+ false
54
+ ```
55
+
56
+ - 対応していない gem が存在する可能性があるので enable にするときは動作確認必須
57
+
58
+ # マジックコメントの例
59
+
60
+ shebang, coding もつけるときはこの順番
61
+
62
+ ```
63
+ % cat a.rb
64
+ #!/usr/bin/ruby
65
+ # coding: ascii-8bit
66
+ # frozen_string_literal: true
67
+ p ''.frozen?
68
+ p ''.encoding
69
+ % ruby a.rb
70
+ true
71
+ #<Encoding:ASCII-8BIT>
72
+ ```
73
+
74
+ # 利点
75
+
76
+ オブジェクト生成が減る
77
+
78
+ ```
79
+ % ruby -e "2.times { p ''.object_id }"
80
+ 16501180
81
+ 16501040
82
+ % cat a.rb
83
+ # frozen_string_literal: true
84
+ 2.times { p ''.object_id }
85
+ % ruby a.rb
86
+ 11393540
87
+ 11393540
88
+ ```
89
+
90
+ # `"".freeze`
91
+
92
+ ruby 2.1.0 から `"文字列リテラル".freeze` は最適化が入っている
93
+
94
+ ```
95
+ % ruby -e "2.times { p ''.freeze.object_id }"
96
+ 16865720
97
+ 16865720
98
+ ```
99
+
100
+ # 欠点
101
+
102
+ 破壊的変更が必要な場合に対処が必要
103
+
104
+ ```
105
+ % cat a.rb
106
+ # frozen_string_literal: true
107
+ s = ''
108
+ s << 'x'
109
+ p s
110
+ % ruby a.rb
111
+ a.rb:3:in `<main>': can't modify frozen String (RuntimeError)
112
+ ```
113
+
114
+ # 破壊的変更が必要な場合
115
+
116
+ `String#dup` を使う
117
+
118
+ ```
119
+ % cat a.rb
120
+ # frozen_string_literal: true
121
+ s = ''.dup
122
+ s << 'x'
123
+ p s
124
+ % ruby a.rb
125
+ "x"
126
+ ```
127
+
128
+ # 別の方法
129
+
130
+ `String.new` を使う方法もある
131
+
132
+ ```
133
+ % cat a.rb
134
+ # frozen_string_literal: true
135
+ s = String.new
136
+ s << 'x'
137
+ p s
138
+ % ruby a.rb
139
+ "x"
140
+ ```
141
+
142
+ # 違い
143
+
144
+ `Encoding` が違う
145
+
146
+ ```
147
+ % cat a.rb
148
+ # frozen_string_literal: true
149
+ p ''.dup.frozen?
150
+ p ''.dup.encoding
151
+ p String.new.frozen?
152
+ p String.new.encoding
153
+ % ruby a.rb
154
+ false
155
+ #<Encoding:UTF-8>
156
+ false
157
+ #<Encoding:ASCII-8BIT>
158
+ ```
159
+
160
+ # frozen になるリテラル例 (1)
161
+
162
+ `''` や `""` の文字列リテラルは frozen になる
163
+
164
+ ```
165
+ % cat a.rb
166
+ # frozen_string_literal: true
167
+ p 'string'.frozen?
168
+ p "string\n".frozen?
169
+ % ruby a.rb
170
+ true
171
+ true
172
+ ```
173
+
174
+ # frozen になるリテラル例 (2)
175
+
176
+ 文字列補間 (string interpolation) があっても文字列全体は frozen になる
177
+
178
+ ```
179
+ % cat a.rb
180
+ # frozen_string_literal: true
181
+ p "#{1+2}".frozen?
182
+ % ruby a.rb
183
+ true
184
+ ```
185
+
186
+ # frozen になるリテラル例 (3)
187
+
188
+ 文字リテラルも frozen
189
+
190
+ ```
191
+ % cat a.rb
192
+ # frozen_string_literal: true
193
+ p ?a.frozen?
194
+ % ruby a.rb
195
+ true
196
+ ```
197
+
198
+ # frozen になるリテラル例 (4)
199
+
200
+ `%` 記法でもヒアドキュメントでも frozen になる
201
+
202
+ ```
203
+ % cat a.rb
204
+ # frozen_string_literal: true
205
+ p [%q(q), %Q[#{1+2}], <<END].all?(&:frozen?)
206
+ #{1+2}
207
+ END
208
+ % ruby a.rb
209
+ true
210
+ ```
211
+
212
+ # frozen になるリテラル例 (5)
213
+
214
+ `%w` は配列自体は frozen ではないが、文字列は frozen
215
+
216
+ ```
217
+ % cat a.rb
218
+ # frozen_string_literal: true
219
+ a = %w[a b]
220
+ p a.frozen?
221
+ p a.all?(&:frozen?)
222
+ % ruby a.rb
223
+ false
224
+ true
225
+ ```
226
+
227
+ # frozen になるリテラル例 (6)
228
+
229
+ `%W` も同様
230
+
231
+ ```
232
+ % cat a.rb
233
+ # frozen_string_literal: true
234
+ v = "c d"
235
+ a = %W(a\ b #{v}e\sf #{})
236
+ p a.frozen?
237
+ p a.all?(&:frozen?)
238
+ % ruby a.rb
239
+ false
240
+ true
241
+ ```
242
+
243
+ # frozen ではないリテラル例
244
+
245
+ 外部コマンド出力は frozen ではない
246
+
247
+ ```
248
+ % cat a.rb
249
+ # frozen_string_literal: true
250
+ p `echo`.frozen?, %x(echo).frozen?
251
+ % ruby a.rb
252
+ false
253
+ false
254
+ ```
255
+
256
+ # disasm で確認 (1)
257
+
258
+ - `putstring` は `String` を作成
259
+ - `freeze` があると `opt_str_freeze` になる
260
+
261
+ ```
262
+ % ruby --dump=insns -e '""'
263
+ == disasm: #<ISeq:<main>@-e>============================================
264
+ 0000 trace 1 ( 1)
265
+ 0002 putstring ""
266
+ 0004 leave
267
+ % ruby --dump=insns -e '"".freeze'
268
+ == disasm: #<ISeq:<main>@-e>============================================
269
+ 0000 trace 1 ( 1)
270
+ 0002 opt_str_freeze ""
271
+ 0004 leave
272
+ ```
273
+
274
+ # disasm で確認 (2)
275
+
276
+ - `freeze` は再定義チェックが入る
277
+ - `putobject` はオブジェクトをスタックに積むだけ
278
+
279
+ ```
280
+ % ruby --enable=frozen_string_literal --dump=insns -e '"".freeze'
281
+ == disasm: #<ISeq:<main>@-e>============================================
282
+ 0000 trace 1 ( 1)
283
+ 0002 opt_str_freeze ""
284
+ 0004 leave
285
+ % ruby --enable=frozen_string_literal --dump=insns -e '""'
286
+ == disasm: #<ISeq:<main>@-e>============================================
287
+ 0000 trace 1 ( 1)
288
+ 0002 putobject ""
289
+ 0004 leave
290
+ ```
291
+
292
+ # まとめ
293
+
294
+ - ruby 2.3.0 以降を使うなら `frozen_string_literal: true` を積極的につけましょう
295
+ - `freeze` は不要になるので ruby 2.3.0 以降だけを対象にするのなら消すと良い
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-frozen_string_literal
3
+ version: !ruby/object:Gem::Version
4
+ version: 2017.01.14
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: ruby 2.3.0 で追加された `frozen_string_literal` についてちょっと詳しく話します。
28
+ email:
29
+ - zn@mbf.nifty.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.md
36
+ - Rakefile
37
+ - config.yaml
38
+ - frozen_string_literal.md
39
+ - pdf/frozen_string_literal-frozen_string_literal.pdf
40
+ homepage: http://slide.rabbit-shocker.org/authors/znz/frozen_string_literal/
41
+ licenses: []
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 2.5.2
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: "`frozen_string_literal` の話"
63
+ test_files: []