/
ruby-removed-features.rab
350 lines (241 loc) · 12.9 KB
/
ruby-removed-features.rab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
= Ruby 考古学 \n 消された機能編
: subtitle
Archaeology of Ruby: \n Removed Features
: author
Kazuhiro NISHIYAMA
# : institution
# 所属
: content-source
RubyKaigi2014
: date
2014/09/19
: allotted-time
30m
: theme
default
= Self introduction
* one of Ruby Committers
* Mr. fix typo (by Chikanaga)
* I use Ruby since 1.4
== note
まずは自己紹介からです。
C Ruby のコミッターの一人です。
昨日の朝一のちかながさんの発表の CRuby Committers Who's who in 2014 では Mr. fix typo と紹介されていました。
ruby を使い始めた時はバージョン 1.4 系でした。
そのバージョンより後で削除された機能で気になったものについての話をします。
= Agenda
* ((*リリースに入った後、消された機能*)) \n
(('sub:Some features removed after release'))
* 開発版のみに入っていた機能 \n
(('sub:Some features only in development branch'))
== note
まず過去のリリースに入っていたのに、消された機能の話です。
= Safe Level
* (({$SAFE=4})) is obsolete since 2.1.0
* 不完全な Sand Box
* Safe Level 自体の削除の話も何度かあった
== note
最近のリリースで削除された大きな機能として、
safe level 4 があります。
元々 Ruby の sand box 機能として safe level は不完全で、
safe level 自体の削除の提案がされたことも何度かありました。
(参考: https://bugs.ruby-lang.org/issues/8468#note-15 )
= Safe level
* ((<Feature #8468 Remove $SAFE|URL:https://bugs.ruby-lang.org/issues/8468>))
* Matz agreed at GitHub Tokyo drinkup (on 2013)
* tDiary, which is the only application using $SAFE == 4, also agreed
* (({$SAFE < 4})) is a fail-safe feature to detect bugs of applications
== note
そういう経緯もあり、2013 年の GitHub Tokyo drinkup で削除が合意されたようです。
(参考: https://bugs.ruby-lang.org/issues/8468 )
その場で safe level 4 を使っていた tDiary の開発者の賛成もあったようです。
その後の redmine 上での議論では、
JRuby では長い間 safe level をサポートしていなかったが、特に指摘されたことはなかったとか、
ActiveScriptRuby は safe level 3 を使っているなどの意見があったため、
4 未満の safe level はセキュリティ機能としてではなく、
バグ発見用のフェイルセーフ機能として残ることになったようです。
詳しい経緯は 8468 番の issue を見てください。
= Safe Level
* (({$SAFE=4})) is obsolete since 2.1.0
(('sub:raise ArgumentError'))
* (({untrust})) since 1.9.1
* (({untrust})) is deprecated since 2.1.0
(('sub:its behavior is same as taint'))
== note
その結果、 2.1.0 では safe level の 4 は廃止されて、
4 を設定しようとすると ArgumentError が発生するようになりました。
その前の 1.9.1 で untrust が導入されて
少しセキュリティ対策が強化されたこともあったのですが、
活用されることなく 2.1.0 では deprecated になり、
taint と同じ動作になってしまいました。
= (({'.'})) from (({$LOAD_PATH}))
* security reason
* same as (({PATH})) does not contain (({'.'}))
since 1.9.2
* use (({require_relative})) instead
== note
セキュリティ関係といえば、
セキュリティ上の理由で '.' (ドット) が (('$LOAD_PATH')) からひっそり取り除かれました。
理由としては実行コマンドの検索パスがカレントディレクトリを含んでいないのと同じ理由です。
代わりの機能として require_relative が使えます。
= (({$KCODE}))
* from (({$KCODE})) to Encoding (m17n)
* (({$KCODE})) #=> nil # warning: variable $KCODE is no longer effective
* (({$KCODE=})) # warning: variable $KCODE is no longer effective; ignored
== note
ruby 1.9 の多言語化対応の影響で $KCODE の代わりに Encoding を使うようになりました。
そして $KCODE の参照は常に nil がかえってくるようになり、
$KCODE への代入は無視されるようになりました。
= Regexp options
* Regexp literal options (remains) : (({/n /e /s /u}))
//n.encoding #=> #<Encoding:US-ASCII>
//e.encoding #=> #<Encoding:EUC-JP>
//s.encoding #=> #<Encoding:Windows-31J>
//u.encoding #=> #<Encoding:UTF-8>
== note
一方 $KCODE 関連だった正規表現リテラルの n e s u オプションはまだ残っています。
互換性のために残っているので、そのうちなくなるかもしれません。
そして、もしかすると代わりに a オプションが増える可能性があるかもしれません。
= (({$=})) (ignore case)
* (({$= = true}))
* ruby 1.8.7: warning: modifying $= is deprecated
* ruby 1.9.3: warning: variable $= is no longer effective; ignored
== note
もう一つ、グローバル変数と言えば $= を true にすると
ハッシュのキーの文字列などで大文字小文字を無視することが
出来るという機能がありました。
使ったことがある人はほとんどいないと思いますが、
1.8 で影響範囲が限定的になり、
1.9 でそういう機能はなくなりました。
ドキュメントに残っていることがありますが、もう使えないので、
見かけても無視してください。
= (({$deferr}))
(('sub:between 1.6.7 and 1.8.0'))
* (({$deferr})) → (({$stderr}))
* (({$defout})) → (({$stdout}))
* (({$stderr=})) → (({STDERR.reopen}))
* (({$stdin=})) → (({STDIN.reopen}))
* (({$stdout=})) → (({STDOUT.reopen}))
== note
さらに昔の話になりますが、
ruby 1.7 の頃には $defout や $deferr というグローバル変数があって、
子プロセスに影響しない出力先変更に使われていましたが、
今は $stdout と $stderr に統一されて、
子プロセスに影響するリダイレクトは reopen を使うようになりわかりやすくなりました。
今は子プロセスに影響しないリダイレクトは $stdout や $stderr への代入で、
子プロセスに影響するリダイレクトは reopen を使うということを覚えておけば良いと思います。
さらに言えば、今は子プロセスを起動するときにリダイレクトなどを柔軟に指定できる
Process.spawn などのメソッドを使う方がおすすめです。
= (({if cond:}))
(('sub:until 1.8'))
if true:
p true
end
((':')) をつけられる隠し機能の削除
== note
ruby 1.8 までは if の条件式の後ろなどに ((':')) を付けられるという隠し機能がありましたが、
1.9 では取り除かれました。
隠し機能のはずなのになぜか使われていて、修正が必要だった gem などもあったようです。
= (({File.exists?}))
* (({File.exist?})) (recommend)
* (({File.exists?})) (deprecated)
Ruby 本体のメソッド名は出来るだけ三単現のsを付けない
File.exists? IO::NULL
# warning: File.exists? is a deprecated
# name, use File.exist? instead
== note
Ruby 本体のメソッド名は出来るだけ三単現のsを付けないというルールがあるので、
File.exists? は以前警告が出ていたのですが、
何かのミスだったのか警告が一度出なくなって、
また出るようになったという経緯があります。
そういう経緯もあってメソッド自体はまだ残っていますが、
警告も出るようになっているので、
そのうち消されると思います。
= Agenda
* リリースに入った後、消された機能 \n
(('sub:Some features removed after release'))
* ((*開発版のみに入っていた機能*))\n
(('sub:Some features only in development branch'))
== note
続いて開発版のみに入っていた機能についての話をします。
= Symbol < String in 2006 (1.9.0-dev)
* Symbol が String を継承していた時期があった
* Symbol < Stringも止める。caseとかでのバグをたくさん生んでしまう
(('sub:http://www.rubyist.net/~matz/20061107.html#p03'))
== note
ruby 1.9 の開発版の一時期に Symbol が String を継承するように変更されていた時期がありましたが、
問題が多かったため、元通り継承関係のないクラス階層に戻されました。
matz 日記には理由として「caseとかでのバグをたくさん生んでしまう」と書かれていました。
= Symbol < String (cont.)
ruby 1.8.7:
// =~ :s
#~> TypeError: can't convert Symbol into String
methods[0].class #=> String
ruby 1.9.3:
// =~ :s #=> 0
methods[0].class #=> Symbol
* 継承は止めても String に似た扱いは入った。
== note
その影響もあり Symbol に String っぽい挙動が残っています。
その後 methods メソッドのように返り値が String から Symbol に変わったなどの影響もあり、
継承関係はなくなったものの Symbol を String に似た扱いにするメソッドが ruby 1.8 までに比べると
ruby 1.9 以降では多くなっています。
= (({__send}))
(('sub:between 1.8 and 1.9'))
* (({__send__})) cannot call private methods
* (({__send})), (({__send!}))
* (({public_send})) since 1.9.1
private メソッド呼び出し用途が多く影響範囲が広いため元の挙動に
== note
ruby 1.9 の開発版の途中で send が今の public_send 相当の private メソッドは呼べないという変更が入り、
(({__send})) と (({__send!})) というメソッドが導入されたことがあったのですが、
アクセス制限を回避して private メソッドを呼び出すために send を使っていることが多く、
影響が大きすぎたため、元に戻されて (({public_send})) というメソッドが導入されました。
= Real multi-value (to_splat)
(('sub: 1.9.x'))
* (({to_splat})) (!= (({to_ary}))) (!= (({to_a})))
* svalue, avalue, mvalue
* e.g. (({a, b = mvalue}))
== note
これも ruby 1.9 の開発版での話なのですが、
2006年頃に真の多値を導入しようとしていた時期があり、
to_ary とは別に to_splat というメソッドが呼ばれるようになっていた時期があったのですが、
リリースされることなく to_splat などは消えました。
リリースされずに消えたので、確認できないので間違っているかもしれませんが、
多重代入のときなどに to_a や to_ary の代わりに to_splat を呼ぶようになっていたのだと思います。
= Symbol.find in 2.2.0-dev
* Symbol.find(str) \n -> symbol or nil
* Return the related symbol if the symbol already exists.
* Return nil if not.
* revision 47543
* Removed because of Symbol GC
* If you still want this, request again on Redmine.
== note
昨日のなりさんの Symbol GC の発表で話があったように、
ruby 2.1 までは Symbol は GC の対象ではなかったため、
ruby 2.2 の開発版で Symbol が既に存在するかどうか調べるメソッドが追加されました。
しかし、 2.2.0 で Symbol GC が導入されたため、
リリースに入ることなく削除されました。
それでも必要だと思ったら、redmine で再度リクエストしてくださいとコミットログに書いていました。
= statfs in 2.2.0-dev
* (({IO#statfs})) and (({File::Statfs}))
* https://bugs.ruby-lang.org/issues/9772
* (({statfs.f_type})) for tests
* Reject at ((<DevelopersMeeting20140517Japan|URL:https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140517Japan>))
(('sub:「Matz: 色々込み入ってるので core には入れないで test 配下へ. 欲しいということがあったら gem にしてください.」'))
== note
次に ruby 2.2 の開発版にのみ存在した statfs の話です。
statfs.f_type がテストに必要ということで、とりあえず追加されて、
各種 OS 対応など、みんなで変更していたのですが、5月17日の開発者会議で
「色々込み入ってるので core には入れないで test 配下へ. 欲しいということがあったら gem にしてください.」
という理由で却下され、最低限の機能だけ test 配下に入り、一般に使える機能としては入りませんでした。
= Conclusion
* Some features only in development branch
* Some features cannot introduce because of compatibility
== note
最後にまとめです。
いくつかの機能は開発版だけで消えてしまっています。
またいくつかの機能は互換性のために入らなかったり他の機能になったりしています。
入らなかったり削られたのがなぜなのかを考えることで、
今後の新機能の提案に生かしていただければ、
ということで話を終わります。