[ruby-trunk - Feature #6643][Open] io.seek(off, :end)

2012$BG/(B10$B7n(B30$BF|(B 8:47 ko1 (Koichi Sasada)
[email protected]:

Issue #6643 has been updated by ko1 (Koichi Sasada).

Target version set to 2.0.0

$BEDCf$5$s$K0l1~J9$$$F$*$-$?$$$H$3$m!%(B

$B:G?7$N%Q%C%A$O3NG’$7$F$$$J$$$N$G$9$,!"(B
IO::SEEK_* $B$NCM$r%7%s%%k$KJQ$($F$7$^$&$N$O$I$&$J$N$+$J$!!#(B

StringIO $B$O=$@5$9$l$P:Q$`$o$1$G$9$,!“(B
StringIO $B0J30$K$b$@$l$+B>$N?M$,(B IO
$B$b$I$-$r:n$C$F$$$k2DG=@-$O$”$C$F!"(B
$B$=$&$$$&$b$N$KBP$9$kHs8_49@-$K$J$j$^$9$h$M$'!#(B

IO::SEEK_* $B$rJQ$($k$H(B io.seek(IO::SEEK_END)
$B$H=q$$$F$b<:GT$K$J$k$H$$$&(B
$BMxE@$O$"$k$N$G$9$,!"7c$7$$$J$!!#(B

Issue #6643 has been updated by kou (Kouhei S.).

ありがとうございます!

反対している人はいないので、コミットしていいんじゃないかなぁと思います。

Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version:

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

Issue #6643 has been updated by Glass_saga (Masaki M.).

Akira T. wrote:

StringIO は修正すれば済むわけですが、
StringIO 以外にもだれか他の人が IO もどきを作っている可能性はあって、
そういうものに対する非互換性になりますよねぇ。

そうですね。
最新のパッチ(patch2.diff)では、そういう懸念があるのでIO::SEEK_*の値は変えずにIntegerもSymbolも受け付けるようにしています。

Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: 2.0.0

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

2012$BG/(B10$B7n(B31$BF|(B 22:23 Glass_saga (Masaki M.)
[email protected]:

Issue #6643 has been updated by Glass_saga (Masaki M.).

$B$=$&$G$9$M!#(B

$B:G?7$N%Q%C%A(B(patch2.diff)$B$G$O!“$=$&$$$&7|G0$,$”$k$N$G(BIO::SEEK_*$B$NCM$OJQ$($:$K(BInteger$B$b(BSymbol$B$b<u$1IU$1$k$h$&$K$7$F$$$^$9!#(B

$B$9$$$^$;$s!#<:Ni$7$^$7$?!#(B
(redmine $B$,Mn$A$F$$$k$H$-$K%a!<%k$r=q$/$N$G$O$J$+$C$?(B…)

$B%Q%C%A$r8+$F;W$C$?$N$G$9$,!“(B:eNd $B$H$+$^$G<u$1IU$1$F$$$k$N$O!”(B
$B<u$1IU$1$9$.$G$O$J$$$+$J$!!"$H$$$&5$$,$7$^$9!#(B

% ./ruby -ve ‘open(“NEWS”) {|f| f.seek(0, :eNd); p f.pos }’
ruby 2.0.0dev (2012-11-06 trunk 37493) [x86_64-linux]
10175

$B$^$?!“%(%i!<%a%C%;!<%8$K=P$F$/$k$N$O!”>.J8;z$KJQ49$7$?8e$N$b$N$K(B
$B$J$C$F$$$^$9$,!“$3$l$O%(%i!<%a%C%;!<%8$H$7$F@53N$G$O$J$$$J$!!”$H;W$$$^$7$?!#(B

% ./ruby -ve ‘open(“NEWS”) {|f| f.seek(0, :FOO); p f.pos }’
ruby 2.0.0dev (2012-11-06 trunk 37493) [x86_64-linux]
-e:1:in seek': unknown whence: foo (ArgumentError) from -e:1:in block in ’
from -e:1:in open' from -e:1:in
zsh: exit 1 ./ruby -ve ‘open(“NEWS”) {|f| f.seek(0, :FOO); p f.pos
}’

Issue #6643 has been updated by Glass_saga (Masaki M.).

patch2.diff(IO::SEEK_*の値は変えないで、新たにSymbolも大文字小文字を無視して受け付けるようにしたpatch)をコミットしたいのですが、反対はありませんか?
しばらく待って反対がなければ、入れてしまおうと思います。

Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: 2.0.0

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

Issue #6643 has been updated by knu (Akinori MUSHA).

今さらですが、すべて大文字のシンボルだけサポートすればいいのではないでしょうか。
seekのラッパーとか、IOライクなクラスの実装とかで揺れの許容が期待されるのは重荷になると思います。
こうしたコンベンションを他のメソッドにおける定数にも拡大していくことを考えるとなおさらです。

「Unix/Cの定数マクロをシンボル化する際は、大文字のまま。自明な場合は共通のプレフィックスを除く」というシンプルなルールに沿えば、trapにおけるシグナル名の扱いとも整合しますし、毎度:cur→:currentみたいな略語の展開など余計なことを考えなくて済みます。


Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: 2.0.0

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

Issue #6643 has been updated by Glass_saga (Masaki M.).

「Unix/Cの定数マクロをシンボル化する際は、大文字のまま。自明な場合は共通のプレフィックスを除く」というシンプルなルール

IO#adviseはこのルールに沿っていませんね。
例えばPOSIX_FADV_NORMALに対応するRubyのシンボルは:normalです。

一方BasicSocket#setsockoptはこのルールに従っていて、例えばSO_REUSEADDRに対応するシンボルは:REUSEADDRです。

ルールを決めて統一してしまった方が良いのかも知れません。

Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: 2.0.0

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

Issue #6643 has been updated by Glass_saga (Masaki M.).

File patch3.diff added

:setか:SETの類だけ受け付ければ良いのであれば、小文字のシンボルも大文字のシンボルも変数として持っておいて良いんじゃないかなあと思いました。
(あまりスマートではない気もしますが)

:Setや:Currentも使えた方が良い、という人はいませんよね?

なので、そのようにしたpatchをつくりました。
:eNdのようなシンボルまで受け付けてしまう問題、エラーメッセージの正確さの問題はこれで解決します。
また、先のpatchではdowncase!して小文字に合わせていたので、大文字が好みの人にだけメソッド呼び出しのコストを強いていましたが、
両方変数として持っておけばそのような事もありません。

Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: 2.0.0

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

Issue #6643 has been updated by mame (Yusuke E.).

Target version changed from 2.0.0 to next minor


Feature #6643: io.seek(off, :end)

Author: akr (Akira T.)
Status: Assigned
Priority: Normal
Assignee: akr (Akira T.)
Category:
Target version: next minor

IO#seek メソッドの whence 引数としてシンボルを受け付けるようにしませんか。

つまり、
io.seek(0, IO::SEEK_END)
のかわりに
io.seek(0, :end)
とかけるようにする、ということです。

IO::SEEK_END と等価な指定として :end,
IO::SEEK_CUR と等価な指定として :cur,
IO::SEEK_SET と等価な指定として :set を
受け付けるようにします。

思い立ったきっかけとしては、
ひさしぶりに seek を使ったら、
io.seek(IO::SEEK_END)
と書いてしまって、これは私の環境では IO::SEEK_END が 2 なので、
io.seek(2)
つまり
io.seek(2, IO::SEEK_SET)
と解釈されてしまって、ちょっと悩んだためです。

もし同様な間違いをしてしまっても、IO::SEEK_END でなく :end と
書いたのであれば、
io.seek(:end)
は can’t convert Symbol into Integer (TypeError) となるので悩まなくて済んだのに、
と思いました。

なお、その間違いをしたのは私だけではないようで、検索すると
http://jira.codehaus.org/browse/JRUBY-1897
http://rubyforge.org/pipermail/biocatalogue-developers/attachments/20100512/2eacb73c/attachment-0001.html
というふたつの例が見つかります。

どうでしょうか。

2012$BG/(B11$B7n(B24$BF|(B 10:35 mame (Yusuke E.) [email protected]:

Feature #6643: io.seek(off, :end)
Feature #6643: io.seek(off, :end) - Ruby master - Ruby Issue Tracking System

IO#seek $B%a%=%C%I$N(B whence
$B0z?t$H$7$F%7%s%%k$r<u$1IU$1$k$h$&$K$7$^$;$s$+!#(B

$B5DO@$rFI$_D>$7$?$N$G$9$,!“7k6I!”$3$l$+$i0U8+$,$^$H$^$k$-$O$7$J$$$N$G!“(B
$B:G>.8B$N$b$N$rF~$l$h$&$H$$$&$3$H$G!”(BC
$B%W%m%0%i%^$K$o$+$j$d$9$$$H$$$&M}M3$G!"(B
C $B$HF1$8BgJ8;z$G(B :CUR, :END, :SET
$B$@$1<u$1IU$1$k$H$7$FF~$l$^$7$?!#(B