universato
universato
This issue help me. Thank you!! (Sorry for wrong references)
それですね。ありがとうございます。 よりいうと[2017年8月26日のsho-hさんのコメント](https://github.com/rurema/doctree/issues/523#issuecomment-325074698)です。 > 確かにサンプルであることは自明かと思いますので、「例」を書くかどうかというよりも分けて表示されてほしいという感じです。例えば文章が間に挟まれるなら「例」なしでも気になりません。 ここでsho-hさん自身も、分けて表示されてコードのブロックであることがわかりやすくなるために「例」を書いて欲しいと言っており、`#@samplecode`の記法が導入されたことにより「例」をわざわざ書くメリットはないのではと思います。 ここにガイドラインがあるんですね。 [rurema/doctree Wiki: SampleCodeGuideline#体裁](https://github.com/rurema/doctree/wiki/SampleCodeGuideline#%E4%BD%93%E8%A3%81) > 各サンプルの先頭に`例:`の文言を記載してください > 複数のサンプルを続けて記述する場合は、各サンプルごとに`例:`を記載してください
2.7.0でブロックなしprocに対して非推奨の警告がでるようになっていたのですが、 2.7.2でRuby全体でデフォルトで警告がでなくなって、 3.0.0でブロックなしprocは動かなくなったみたいですね。 ところで、「イテレータの定義」って小題は、変な気がしますね。「ブロック付きメソッド」? ## 参考 [プロと読み解くRuby 2\.7 NEWS \- クックパッド開発者ブログ](https://techlife.cookpad.com/entry/2019/12/25/121834) ここの「`proc/lambda`をブロックなしで呼ぶのは非推奨/禁止になりました」の項目 https://github.com/ruby/ruby/blob/ruby_2_7/NEWS#proclambda-without-block-is-deprecated- 2.7のNEWSファイル https://www.ruby-lang.org/ja/news/2020/10/02/ruby-2-7-2-released/ > 2.7.2 以降では deprecated カテゴリの警告はデフォルトの状態で出力が抑制されます。 https://i.loveruby.net/ja/ruby/iterator.html > 2003/06/18 > 最初に言っておくと、最近の Ruby 界では「イテレータ」という名称はあんま し好まれてない。くりかえさないイテレータが増えてきたっていうのが理由だ。 ではなんと呼べばいいのかっていうと、「ブロック付きメソッド」とか言うらしい。 どうも好きじゃないなあこの名称。
余談ですが、Enumerator.newのブロックなしの例も3.0から同じエラーがでて動かないですね。 Procを作ろうとしてないのにと思いましたが(?) ```ruby str = "xyz" enum = Enumerator.new(str, :each_byte) # prog.rb:3:in `initialize': tried to create Proc object without a block (ArgumentError) ``` https://docs.ruby-lang.org/ja/latest/method/Enumerator/s/new.html
```ruby h = { a: 1 } p h.fetch(:b, nil) # => nil p h.fetch(:b) # in `fetch': key not found: :b (KeyError) ``` 2つ目のデフォルト引数は、`nil`じゃないんですね。 英語版と同じで、3つに分けた方がいいのかなって思いました。 ``` fetch(key) -> object...
雑感です。 https://github.com/rurema/doctree/blob/7dcae13e1f03f4eb712ccafcaae029621625eec4/refm/doc/spec/eval.rd#L19-L23 るりまのページ、`until`が2回でてますけど、並びから見て最初のは`unless`の間違いですね。 if修飾子という単語より、後置ifの方が一般的で読み馴染みがあると思うので、 カッコ書きなどで別の表現があることがわかるようにすると親切そうだなと思いました。 全体を読んだり個別のメソッドページを見たわけではないですけど、 eval, instance_eval, module_evalは、メソッドへのリンクを貼って誘導すれば十分なのではないかと思いました 「Rubyプログラムの実行」のところの記述がない箇所も、[制御構造](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html)の記述を読めば十分なんじゃないかと推測しています。 加筆をするというより、リンクを貼ったり、削除で良いのではないかと思ってます。 個人的に思うのは、加筆が進まないなら、 いっそのことページや項目を丸っと削除した方がいいのでは感じています。 例えば、「クラス」のページとか内容がほぼなく読まれてない気もし、他のページの説明で十分なのかなと思ったり思わなかったり。
結論からいうと、載ってなくていいように思います。 ただ、`Integer`や`String`など特別にそのクラスに何か書くのは説明としてありなのかなと思っています。 (追記: 細かいですが、ここは、`String`じゃなくて、`Symbol`と書くはずでした。`String`も特別でしたが) ## るりまの Object#hash の項目による確認 [Object\#hash \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/latest/method/Object/i/hash.html) > ただし、Fixnum, Symbol, String だけは組込みのハッシュ関数が使用されます(これを変えることはできません)。 この引用にはまだPRが反映されてなく`Fixnum`と書いてありますが、他のクラスなら`hash`が呼ばれる局面でも、`Integer`や`Symbol`は内部に組み込まれたハッシュ関数が使われているようです。 仮にRubyユーザーが再定義したとしても内部で定義された関数が呼ばれ、ユーザーが独自に再定義する意味も特別なさそうです。 ## methodメソッドによる確認 `Integer`や`Symbol`などは`hash`が独自に定義されてないことが伺えます。 ```ruby p 1.method(:hash) # => # p :sym.method(:hash)...
自分で引用しておきながらよく読めてなかったですが、`String`も特別だったんですね。`Integer`や`Symbol`はRubyメソッドとして`hash`が再定義されてないのに、`String`の方では`hash`が再定義されているようで不思議です。 ```ruby p "".method(:hash) # => # ``` ## IntegerやSymbolでのhashの項目・説明について ここは、自分の意見の補強です。 う〜ん、再定義もされてない継承してるだけのメソッドは、基本的にそのクラスのインスタンスメソッドとして説明があるわけではないし、(再定義も含んで)定義されているかどうかでメソッドの説明を載せるかどうかになっていると、わかりやすい線引でよさそうと思っていました(実際のるりまは、ここに例外もありますが)。 また、`Integer`や`Symbol`も確かに特別だから、何かそのクラスに説明があってもいいのかもしれませんが、それでもやはり`Integer#hash`や`Symbol#hash`が再定義されているわけでもないし、普通ユーザーが直接使うわけでも再定義するところでもないメソッドだと思うので、他の一般的なメソッドと混じったらよくないのではという懸念がありました。 しかし、`String`は項目としてあるし特別である旨を追記してあってもいいと考えますが、(背景を知らずに)`Integer`や`Symbol`にその説明がなかったら「なんでやねん」と思う感じがする気もします。 ## NumericでのObject#hashについて 以下の観点から、`Numeric`に`Object#hash`が載ってないのは、おかしくないように思います。 - `Numeric`クラスの説明で、継承しているメソッドは「Comparableから継承しているメソッド」と明記されている。 - 自分の知る限りでは、どのクラスも`Object`から継承しているメソッド一覧は存在しない。 - 冒頭で`Object`から継承している事実だけが書かれている。 - 普通は、ユーザーが`Numeric`で`hash`メソッドを再定義するようなことも直接使うこともない。 - `Numeric`で`hash`に関して、`Integer`・`String`・`Symbol`のような特別なことはなさそう。 `Numeric`の`Object#hash`だけが何か枠から外れているということはないと思っています。 もしすべてのクラスに`Object`から継承している全てのメソッドを一覧にだすべきという話なら、るりまのユーザーの邪魔にならないかなという懸念の方が強いです。 ただ、この懸念に対しては、折りたたみでメソッド名のリンクだけにするとかなら、この懸念は解消されそうです。
自分が「特別」の意味で使っていたのは、るりまの`Object#hash`の説明にあるように、ユーザーが`hash`メソッドを再定義しても意味がなさないことを指してました。 [Object\#hash \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/latest/method/Object/i/hash.html) > ただし、Fixnum, Symbol, String だけは組込みのハッシュ関数が使用されます(これを変えることはできません)。 ## 具体的には ### 一般的なクラスの場合 具体的には、普通、一般的なクラスだと、`hash`メソッド等を再定義することで、`Hash`のキーや`Array#uniq`などの操作による同一性を変更することができます。 ```ruby class Foo end p({ Foo.new => 1, Foo.new => 2 }) # => {#=>1,...
https://github.com/ruby/ruby/blob/121fa24a3451b45c41ac0a661b64e9fc8600e589/hash.c#L191-L231 ちなみに、Ruby側の実装を見たら、 `Float`, `true`, `false`, `nil`も`Hash`のキーの比較で組み込み関数が使われていました。 特別なのは3つだけではなかったです。 https://github.com/ruby/ruby/blob/fb04c69418ceee696a114fe31279cf3a5ea16d30/array.c#L5115 その他、参考に、Ruby側の実装では、`Array`の`hash`を求める際には、要素に対して必ずRubyで定義された`hash`メソッドが呼ばれるようです。他に、`Complex`, `Rational`, `Range`などの`hash`を求める際も同様でした。