Ruby 初心者スレッド Part 65

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f80-JI52)
垢版 |
2018/12/22(土) 04:43:34.03ID:84E3pYZa0
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ

質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。
Ruby on Rails については、WEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 64
https://mevius.5ch.net/test/read.cgi/tech/1535797516/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/

Ruby コミュニティ公式
https://www.ruby-lang.org/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
490デフォルトの名無しさん (アウウィフ FF11-a57L)
垢版 |
2019/07/01(月) 17:05:17.93ID:87GWfzf4F
startswith や endswith には s ついてる
2019/07/01(月) 18:04:52.69ID:MoEwNeEzM
識別子に?や!使えるようにしてるもんだから他の言語は?.のところ&.なんだよなwww
ダッサwwwww
2019/07/01(月) 19:31:12.97ID:sgfBLVFM0
>>489
sort「!」なんかの時点で、もう英語は関係ないやろ!w
2019/07/02(火) 04:10:59.33ID:uMGeffjZ0
PowerShell -Part 3

744デフォルトの名無しさん2019/07/01(月) 14:41:57.11ID:YzHO/9WR
>>743
どうでもいい

745デフォルトの名無しさん2019/07/01(月) 16:21:19.60ID:MoEwNeEz
>>743
死ね

745は、色んなスレに「死ね」って書いてる荒らし。ID:MoEwNeEz。
荒らしは必ず、複数の書き込みをするので要注意!

Ruby 初心者スレッド Part 65

485デフォルトの名無しさん (アメ MM39-rSnO)2019/07/01(月) 12:57:54.84ID:MoEwNeEzM
put stringの略だとよwww
to_sとかもそうだけどjap engrish思考よなwwww

491デフォルトの名無しさん (アメ MM39-rSnO)2019/07/01(月) 18:04:52.69ID:MoEwNeEzM
識別子に?や!使えるようにしてるもんだから他の言語は?.のところ&.なんだよなwww
ダッサwwwww
2019/07/02(火) 08:05:59.97ID:b3K46sKz0
>>493
他人をどうこういう前に、お前の書き込み履歴と鏡を見直せ
495デフォルトの名無しさん (ワッチョイ a97c-a57L)
垢版 |
2019/07/02(火) 09:54:03.28ID:dJ0Zw08U0
493 は死んで良い
2019/07/03(水) 12:11:49.04ID:+RO4gFPu0
俺も493は死んでいいと思う
497デフォルトの名無しさん (ワッチョイ ff2c-NenP)
垢版 |
2019/07/10(水) 14:15:50.44ID:Jbt6AAsO0
redo は、現在のループをやり直すけど、
ループを最初の要素から、やり直すにはどう書く?

例えば、3 なら、また1 からループを始める

ary = [ 1, 2, 3, 4 ]

ary.each do |num|
p num if num == 3
end
498デフォルトの名無しさん (ワッチョイ 03e7-MLAK)
垢版 |
2019/07/10(水) 15:22:02.98ID:tfcMfkAP0
>>497
http://ideone.com/8UfEyv

もしもCPUの仕組みを知っていれば、制御変数 i は
プログラムカウンタのことだと見立てることができます
さらに抽象化して、もしもステートマシンを知っていれば:
・ブロック do .. end は状態遷移を表し、
・ブロック引数 i は遷移元状態であり、
・ブロックの評価値は遷移先状態であると
見立てることができます

なお、loop.inject というパターンは過去にも別スレで利用しました
 https://mevius.5ch.net/test/read.cgi/tech/1415419907/264
 > なおメソッド loop は一般に loop do .... end という手続き型のスタイルで
 > 書かれることが多いために ループ構文の一種と誤解されがちですが、
 > (lambda を構文糖であると >>254 が 勘違いしたように....)
 > loop はメソッドですので(コードで示したように) inject へ
 > チェーンさせることができます
2019/07/10(水) 16:16:11.40ID:Jbt6AAsO0
require 'prime'

p ary = Prime.prime_division( 18 )
#=> [[2, 1], [3, 2]]

18 を素因数分解した結果、

[[2, 1], [3, 2]]、2が1回, 3が2回みたいな表記を、
単純に、[2, 3, 3]のように開くには、どうすればよいですか?
2019/07/10(水) 16:39:54.23ID:Jbt6AAsO0
>>498
ありがとう

loop.inject か、トリッキー!
どちらも使い慣れないから、頭を使う!

each_with_index, each_with_object では、ダメなのか
501デフォルトの名無しさん (ワッチョイ 03e7-MLAK)
垢版 |
2019/07/10(水) 17:37:17.74ID:tfcMfkAP0
>>499
[[2, 1], [3, 2]].flat_map { |n, e| [n] * e }
#=> [2, 3, 3]
2019/07/10(水) 18:02:55.65ID:Jbt6AAsO0
>>501
ありがとう

flat_map は便利ですね
503デフォルトの名無しさん (ワッチョイ 3f2c-QKg6)
垢版 |
2019/07/20(土) 14:16:26.97ID:NKxgAyGK0
乱数はメルセンヌツイスタらしいけど、
偏るので、マシなやり方はないですか?

Array.new( 25 ) { rand( 1..9 ) }

出力
[3, 2, 4, 3, 6, 3, 1, 3, 7, 6, 1, 9, 3, 2, 5, 6, 6, 7, 5, 6, 3, 3, 8, 4, 9]
[5, 8, 4, 1, 3, 3, 2, 2, 9, 7, 9, 7, 7, 6, 7, 4, 3, 4, 5, 4, 8, 8, 7, 2, 5]
[7, 7, 6, 7, 9, 5, 8, 2, 8, 5, 1, 8, 4, 9, 3, 3, 9, 8, 6, 1, 1, 3, 5, 7, 2]
504デフォルトの名無しさん (エムゾネ FF5f-CMz4)
垢版 |
2019/07/20(土) 14:25:34.88ID:1y0e4GF6F
a=[3, 2, 4, 3, 6, 3, 1, 3, 7, 6, 1, 9, 3, 2, 5, 6, 6, 7, 5, 6, 3, 3, 8, 4, 9]
b=[5, 8, 4, 1, 3, 3, 2, 2, 9, 7, 9, 7, 7, 6, 7, 4, 3, 4, 5, 4, 8, 8, 7, 2, 5]
c=[7, 7, 6, 7, 9, 5, 8, 2, 8, 5, 1, 8, 4, 9, 3, 3, 9, 8, 6, 1, 1, 3, 5, 7, 2]

(a+b+c)/3
2019/07/20(土) 16:32:33.97ID:/lD6o5wQM
>>503
なぜ偏っていると思ったの?統計取った?
Rubyistは一般にあまりレベルが高くないとはいえ、Rubyのコミッタ陣は少なくとも今の君よりは知識も能力も経験も上だと思うよ
506デフォルトの名無しさん (ワッチョイ 7f2d-ShKg)
垢版 |
2019/07/20(土) 17:05:02.08ID:wkIhGLkm0
2人コミッター知ってるけど何の専門家でもなければまともな経歴でもないよ・・・・
507デフォルトの名無しさん (ワッチョイ 4f7c-CMz4)
垢版 |
2019/07/20(土) 17:08:41.13ID:ppdy8tl00
メルセンヌツイスターって初期化しなくて良いんだっけ
2019/07/20(土) 17:54:18.98ID:QHhW8HGw0
>>504
乱数で平均値を取ったら中央値に近づいて偏りが酷くなるだけじゃね
2019/07/20(土) 17:57:37.26ID:NKxgAyGK0
Kernel#rand の種は、現在時刻で初期化されるから、意識しないでもよい

統計を取れば、平均になるだろうけど、1回1回が偏る。
例えれば、

1回目 : 3,3,1,1,3,3,1,1
2回目 : 2,2,8,8,2,2,8,8
3回目 : 5,5,9,9,5,5,9,9

平均すると、まんべんなく出るのだろうが
2019/07/20(土) 18:02:25.41ID:NKxgAyGK0
例えば、503 で偏る部分は、

5, 6, 6, 7, 5, 6
9, 7, 9, 7, 7, 6, 7
7, 7, 6, 7
9, 3, 3, 9

何回やっても偏る
511デフォルトの名無しさん (ワッチョイ 4f7c-CMz4)
垢版 |
2019/07/20(土) 18:37:19.17ID:ppdy8tl00
おま環かどうか切り分けるために
codepad.org
とか
ideone.com
あたりで実行してみたら
512デフォルトの名無しさん (ワッチョイ 4f7c-CMz4)
垢版 |
2019/07/20(土) 18:37:49.12ID:ppdy8tl00
おま環かどうか切り分けるために
codepad.org
とか
ideone.com
あたりで実行してみたら
2019/07/20(土) 19:30:22.40ID:NKxgAyGK0
codepad は古すぎる!
p RUBY_VERSION #=> "1.8.6"

一方、Paiza.io では、"2.6.3"

[3, 6, 3, 8, 8, 9, 1, 3, 1, 4, 3, 8, 2, 2, 2, 6, 6, 9, 4, 2, 2, 9, 1, 1, 1]

これでも偏る

2, 2, 2, 6, 6
2, 2, 9, 1, 1, 1
2019/07/20(土) 19:33:04.24ID:2izalSzA0
1から9が完全に均等に出てほしいなら、(1..9).shuffleとでもすりゃいいんじゃね?
2019/07/20(土) 19:33:38.40ID:jbjCUWIF0
>>513
偏っているか、それともそうでないかを判断する基準をどのように記述していますか?
私には >>513 2 2 2 6 6 が偏っているようにはみえないのです、多分判断基準が違うのだと思います、なにか判断基準を書いていただけますか?
2019/07/20(土) 19:36:50.44ID:NKxgAyGK0
>>513
5, 7 が出てない

それに同じ数字が、3回続くのが、2回も出てる
2019/07/20(土) 19:40:04.58ID:CMictvk+0
まさか1桁の整数の乱数を10個取り出したら0から9までダブってないとかそういうのか
2019/07/20(土) 19:44:24.23ID:NKxgAyGK0
>>514
shuffle, sample も疑似乱数だから、 Kernel.#rand, Random と同じじゃないか?
2019/07/20(土) 19:46:37.50ID:eNhk7IpQr
アホらし
バカが騒いでるだけ
2019/07/20(土) 20:02:00.13ID:b/O9on/e0
乱数なんだから偏ってはいけない。
例えばサイコロを6回ふれば、必ず1〜6の数字が一回ずつ出るのが真の乱数だ
続けて1の目がでるなんてことはあってはいけない

俺の好きなテトリスも昔はテトリス棒が全然出なかったりしたもんだが
今のテトリスは同じものが続けて出ない。偏り無くまんべんなく出てくれるから
次に来るのが予測しやすい。これが真の乱数だ
2019/07/20(土) 20:09:09.31ID:CMictvk+0
つまりテトリスカンパニーのようにメルセンヌツイスタ株式会社みたいなのが数字の出る順番のルールを決めて
ひとつの言語にはひとつのメルセンヌツイスタライブラリしか認可しないというふうにして品質の
2019/07/20(土) 20:57:00.17ID:2izalSzA0
>>518
全然違う
shuffleはただ位置を入れ替えるだけだから、最初の10個には必ず0から9が1つずつ含まれる
これが君の望む乱数のようだからそうすりゃいいんじゃね?と言ってるだけ
2019/07/20(土) 21:02:21.62ID:2izalSzA0
>>522
その代わり、最初の9個を見れば10個目は100%予測できるから、そんなのを「普通は」乱数とは呼ばないんだけどな
ただ、君の言う乱数はどうやら普通とは違うようだから
2019/07/20(土) 21:11:50.98ID:CMictvk+0
ものによっては「7が最近出てないのでそろそろ出るはず」「1が何回も出るはずがない」を支持するデタラメ数が必要とされることはあるのだが
それは乱数で表現されるものではないので自前で実装するよりない
525デフォルトの名無しさん (ワッチョイ cf4e-NxfS)
垢版 |
2019/07/20(土) 21:43:20.93ID:/ET4uH9K0
乱数 まろやか で検索するといいぞ。ポイントは正規分布
2019/07/20(土) 21:51:55.20ID:NKxgAyGK0
JavaScript でも作ってみたが、これも乱数が偏っている。
7, 1, 7, 7, 5, 4, 7, 4, 1

function get_random_int( ) {
return function( ) {
const min = 1
const max = 9
return Math.floor( Math.random( ) * ( max + 1 - min ) ) + min ;
};
}

const ary = [ ...Array( 25 ) ].map( get_random_int( ) )

console.log( ary );

出力
[ 2, 8, 6, 2, 5, 7, 8, 1, 4, 6, 7, 1, 7, 7, 5, 4, 7, 4, 1, 3, 4, 5, 6, 8, 6 ]
527デフォルトの名無しさん (ワッチョイ cf4e-NxfS)
垢版 |
2019/07/20(土) 22:07:15.82ID:/ET4uH9K0
>>526
赤黒が1/2の確率で出るルーレットがあります。
三回回したところすべて黒が出ました。
次に赤が出る確率は?
一般人「1/2」
バカ「こんなに黒が続いたんだからそろそろ赤が出ないとおかしい!偏っている!だから赤100%だ!!」
2019/07/20(土) 23:53:39.37ID:QHhW8HGw0
>>526
乱数にけちつける前に10面ダイス買ってきて、10000回振って出目をメモして偏りを確認してこい。
それが片寄ってると思うなら、別の店でダイス買い直して再試行しろ。
終わるまでスレに帰ってくるなよ。
529デフォルトの名無しさん (アウアウエー Sabf-CMz4)
垢版 |
2019/07/21(日) 01:29:14.20ID:7an9cjGSa
リアルのダイスは安物だと
1の目と6の目で掘り具合が適当で
重心がばらつくから良くない
1をでかく掘ってあって
ちゃんとバランスとってる香具師を買え
530デフォルトの名無しさん (ワッチョイ 7fd2-W26c)
垢版 |
2019/07/21(日) 05:50:29.99ID:8kiQELFp0
>>503
欲しいデータはこんなの?
2 5 6 9 7 3 1 4 8
8 4 6 2 5 7 1 3 9
2 1 9 8 5 7 4 6 3
2019/07/21(日) 06:37:51.08ID:OIgMVs9g0
>>528
10面ダイスなんて偏ってるに決まってるだろ何次元人だお前
20面ダイスの下1桁を記録させるのが正しい
2019/07/21(日) 14:26:31.51ID:rj1b8/he0
単純にサンプル数が少なすぎる
2500回ぐらい生成してから文句言え
2019/07/21(日) 15:02:07.14ID:NYTsshMI0
1から9まで出る乱数を9個抜き出したとき:

1から9までの数が1個ずつ含まれる確率
9!/9^9 = 0.09%

1から9までの数のうち4個ある数字が1つ、2個ある数字が2つ、1個ある数字が1つである確率
9(8C2)6(9C4)(5C2)(3C2)/2/9^9 = 0.7%

10倍ぐらい確率が違うんだよ
「君の言葉で言う偏る」のは確率で見てもむしろ当然

# 計算式が合ってるかは誰か検証して
2019/07/21(日) 15:05:40.77ID:NYTsshMI0
あ、>>526
分かるだろうけど
2019/07/21(日) 15:10:50.24ID:NYTsshMI0
もっと単純化して言ってしまえば、コインを2回投げたときに、表裏が1回ずつ出る確率と
表か裏かのどちらかしか出ない確率は同じだというのはすぐ分かると思う

それを「どちらかしか出ない場合があるのは偏ってる!」と言ってるようなもんだよ、これは
2019/07/21(日) 16:40:43.81ID:NYTsshMI0
こういうと、
「25回投げたときに、そのうち10回を取り出して8回以上表か裏が出てたら偏ってるじゃないか」
と言われそうなので、その確率も計算しておこう

面倒なのでPCでぶん回して計算すると、約49%だった。
つまり、25回投げたときに恣意的に10回を取り出して表か裏が8個以上あることなんて普通に
ありえることなんだよね
2019/07/21(日) 16:43:49.84ID:NYTsshMI0
ちなみに、8回以上を9回以上に置き換えても13%の確率があるので、特段珍しいことでもない

さらにちなみに、この計算はRubyを使って行いましたw
2019/07/28(日) 16:46:50.69ID:RyVu3FEFd
ActiveRecordの件数が多い時、メモリを大量に使った際に、その分のメモリが開放されないままになってるように見えるのですがこれは仕様ですか?

メモリ開放のやり方とか、そもそも件数が多すぎる場合はActiveRecord使わないほうが良いなどあったりするでしょうか…?
2019/07/28(日) 17:41:05.41ID:x88Eo97q0
ActiveRecordは知らんけど、RubyのGCがあんまり働かないのはオレも経験したことがある。
いっそ自動処理をあてにしないで、適当なタイミングで明示的にGC.start()したほうがいいと思う。

あるいは、ちゃんと設定のチューニングをするか。
めんどくさそうなうえに、ちゃんと動作すんのかは知らんけどな。
https://docs.ruby-lang.org/ja/latest/class/GC.html
540デフォルトの名無しさん (スッップ Sdaa-qbpu)
垢版 |
2019/07/31(水) 06:26:20.94ID:F/SyAmOad
>>270
Railsはチュートリアルとか本とかネットの情報も多いけどSinatraは情報が少な過ぎるよ
2019/07/31(水) 12:11:30.33ID:6BPSvdm10
たぶん、インデックスを使っていない、select だろう。
ランキングとか、レコードを総なめ・全件取得する、select だろう

DB の実行計画を見ると、わかる

DB設計は、DB資格の教科書とか、ミックの本などで勉強していないと難しい。
バグのほとんどは設計段階で生じるから、SE の給料が、プログラマーよりも高い!
2019/07/31(水) 12:17:18.62ID:JpBmxHct0
それだと設計ができない無能SEの給料は低くないといけない
2019/07/31(水) 12:20:45.88ID:zH1G6UoN0
>>542
何荒らしにマジレスしてんの
544デフォルトの名無しさん (アウウィフ FFcf-tP4r)
垢版 |
2019/07/31(水) 12:41:48.82ID:+MN2XkdtF
馬鹿には無理
2019/08/01(木) 05:31:11.68ID:n5HVCX7yd
同じリポジトリの同じソースからのデプロイで昨日は成功したのに今日は成功しないのは何でなんだぜ?
Heroku
2019/08/01(木) 05:46:22.10ID:D666GHsD0
韓国に楯突いたことでアメリカからも敵国認定されてブロックされてしまったのだろうな
米国に置いてあるデータ、アメリカ製サービスからは早急に引き上げたほうがいい

エンジニアの生命線が...。米国の貿易施策でGitHubの利用制限を受けるイランなどの国々 | ギズモード・ジャパン
https://www.gizmodo.jp/2019/07/github-trade-control-regulations.html

GitHub、米国の経済制裁対象国ユーザーによる非公開リポジトリ利用をブロック | 財経新聞
https://www.zaikei.co.jp/article/20190730/523662.html
2019/08/01(木) 12:25:16.08ID:czAE5CE00
>>546
イランから手を引けばいいだけでしょ(笑)
2019/08/01(木) 20:11:56.88ID:WaJjQk0q0
ruby はよくある printf の類が日英混合文でも大丈夫?
perl で 日英両対応 align.pl 書いたけど 日本語はprintfのフォームと
ずれてしまったのでコードがそれを避けた書きかたになってしまって
気がはれない
2019/08/01(木) 20:45:19.26ID:lSJbqNGy0
>>548
たぶん言語は関係ない。
文字コード、文字判定、フォント、コンソールなど、環境次第な要素が多すぎる。
2019/08/01(木) 21:12:29.42ID:MCSzD/uO0
Rubyとしては「STDOUTに流すだけで特に何もしてない」ような気がする
Cursesはなんかしてくれてるんだっけ?
2019/08/03(土) 00:58:45.19ID:uTJugp6Y0
逆にその日英混合文がダメな状況ってどういう状況だよ
2019/08/03(土) 10:30:15.37ID:sR/VT/6l0
いわゆる全角半角の文字幅やろ。
2019/08/03(土) 22:04:00.83ID:bbhz9sWw0
やった!!
俺の求めていたものだ
https://logmi.jp/tech/articles/321280
一見楽そうに見えて、余計に面倒なことになるwww
こんなんだったら、初めから型宣言したほうがマシだわな
型宣言の何が嫌なんだろ(謎
意地?
DRYに反してるっていうけど、何処が?

まぁでも求めていた展開だ
本人も作りたくないであろうこんなツールに多大な時間を割くことで
10年単位で他の言語に遅れることになるだろうな
大爆笑
2019/08/03(土) 23:28:43.68ID:sR/VT/6l0
>>553
> DRYに反してるっていうけど、何処が?
Type obj=new Type()
じゃないの?型を2回書いてるじゃん!という。

なお、C#がそうだったんだけど、遠からず改善される予定。
Type obj=new()
# 最初からそうしといてよー、と思わないでもないけど。w

型のDRYを避ける方法はあるんだよな。
しかし、Rubyはそこから目をそらして、DRYを言い訳にして、とにかくなにがなんでもオブジェクトの宣言を含めたくないんだろう。
555デフォルトの名無しさん (ワッチョイ 75e7-27IP)
垢版 |
2019/08/04(日) 03:31:45.57ID:KgSPSwNu0
>>553
>DRYに反してるっていうけど、何処が?

https://qiita.com/t2y/items/2a1310608da7b5c4860b
> def sum_and_stringify(nums: List[int]) -> str:
>   """Adds up the numbers in a list and returns the result as a string."""
> return str(sum(nums))
じゃないの?
型を2回書いてるじゃん!という。

なお本件、改善される計画はなく、いつまで待っても放置される予定。
# ML や Haskell なら最初から型アノーテーションなんて不要だからDRYだけど、
# その方向性を最初から放棄してどうすんのよー、と思わないでもないけど。w

型のDRYを避ける方法はあるんだよな。
しかし、そこから目をそらして、global だの nonlocal だのスコープ問題の泥縄的解決である
変数宣言を言い訳にして、とにかくなにがなんでも型宣言を含めさせたいんだろう。
2019/08/04(日) 12:53:29.81ID:uuq2lSJI0
あと
別ファイルに型定義書くのって立派なDRYじゃねーの?
だって、クラス名やメソッド名変更するとき
両方書き直さなきゃならないじゃねーか
これはDRY以外の何なんだ?
ほんと、ペテン師はいつも自分に都合のいい事だけ言うよな
分かっててすっとぼけるんだわ
信者には悪いが、マジで毎回そう
2019/08/04(日) 13:05:34.87ID:uuq2lSJI0
つまり、
普通に素直に型宣言するより
別ファイルに型定義書く方が
よりDRYだし面倒だし
この掛け違えたボタンで首が絞まる感じ何なん
もう普通に型書いたら?
アホらしすぎ
2019/08/04(日) 13:18:44.89ID:uuq2lSJI0
型定義を別ファイルの書くのって
丁度C言語が.hと.cに分かれてるのと同じ感じだよね
で、関数名変えるとき.hと.cの両方書き換えるっていうね
今更C言語に先祖返りってどうよ
あれDRYって何だっけ
2019/08/04(日) 13:39:41.20ID:uuq2lSJI0
あるクラスの名前を変更する
型定義ファイルに書いてあるクラス名を変更し忘れる
そのクラスの型定義が無くなり型チェックが効かなくなる
プログラマは型チェックが効いてると思い込みテストをサボる
バグを組み込んでしまう
あり得るシナリオだし、こういうのをDRYと言うのではww

同じような感じでヘッダと実装に分かれてるC/C++の場合は
これは間違ってるとコンパイルエラーになるから良いけど
Rubyの場合は修正し忘れてて型定義が見つからない状態になってても
それはそれとして、どうせ無テストになるだけでスルーでしょ
(他に型定義の無いクラスはいっぱいあるわけで型定義が無いだけでエラーには出来ない)

さあ型定義ファイルにあるクラス名とメソッド名が
間違っていないか確かめるテストを書かなきゃねwww
(単純にtypoしてるかもしれないわけで)

で、誰得なんこれ
2019/08/04(日) 15:37:02.28ID:M00OQnGm0
まつもとが型のメリットを理解してないからどうしようもない
561デフォルトの名無しさん (ワッチョイ 232c-n0r7)
垢版 |
2019/08/04(日) 20:45:52.66ID:zjBZp1dd0
WEB+DB vol.111

詳解 Rails 6

コミッターが解説する、26ページ分の特集!
562デフォルトの名無しさん (ワッチョイ 75e7-27IP)
垢版 |
2019/08/05(月) 01:20:57.58ID:xLJRGiJi0
>>556-559
>別ファイルに型定義書くのって立派なDRYじゃねーの?

まず、この文章は「DRY違反じゃねーの」の間違いだろう
これだけでもアンチRubyがDRYという言葉の意味を理解せずに
トンチンカンな批判を繰り返している実証になる

次に上記の文章を:
>>別ファイルに型定義書くのって立派なDRY違反じゃねーの?
と訂正したとしても、答えは NO だ
確かに型推定を最初から放棄してユーザに型アノーテーション記述を
強制する言語(>>555)であれば、その型アノーテーション記述がソースファイルと
同一ファイルであっても別ファイルであってもDRY原則に反している、と言える

しかしRuby3.0で計画されている型プロファイルは、型宣言記述が無い
素のRubyソースコードから型定義ファイル rbi を自動生成できる
また、ソースコードと同一ファイルにアノーテーション(注釈、いわゆるコメント)として
型定義を記述することもできる(ただし、この場合は自動生成されず手書きとなる)
2019/08/05(月) 01:57:11.36ID:kCWOwKEP0
>>562

> トンチンカンな批判を繰り返している実証になる

揚げ足をとれたからって、そんなに必死にならなくても。w
DRYDRYとうるさいのは信者くらいで、ふつうは実はそんなに気にしてないからな。しゃあない。

> 素のRubyソースコードから型定義ファイル rbi を自動生成できる

スケルトンみたいなこと?
その手のやりかたってヤバい原因になりがちだと思うんだけど、だいじょうぶなの?たいがい元ソースコードの変更に追い付けなくなって、うやむやになるよねえ?

> 型定義を記述することもできる(ただし、この場合は自動生成されず手書きとなる)

つまり、ソースを変更したら、あわせてアノテも変更しないといけないのか?
結局はDRY違反なの?

ホントにそんなだったら、どうせ誰も使わない気がするなあ。。。
564デフォルトの名無しさん (ワッチョイ 75e7-27IP)
垢版 |
2019/08/05(月) 02:20:06.63ID:xLJRGiJi0
>>563
>揚げ足をとれたからって、そんなに必死にならなくても。w

揚げ足ってのは、DRYを逆の意味に理解していた(>>556)事実を、
あっさり >>557 の冒頭で指摘されちゃったこと?
まぁしゃあないわな、「揚げ足」を隠そうと必死になるのも www
565564 (ワッチョイ 75e7-27IP)
垢版 |
2019/08/05(月) 02:21:24.98ID:xLJRGiJi0
訂正
X:>>557
O:>>562
2019/08/05(月) 07:34:24.32ID:nl2V9bb60
https://img.logmi.jp/article_images/D2VbGeV4PWY5uay2tHho6g.jpg
こんなんを別ファイルに記述するはめになるんだ
クラス定義に似てるね
重複して同じようなことを二回書かなきゃならないって事
DRYの原則に反してるから型宣言を書きたくないって話だったのに
より一層DRYの原則に反してるね
C++のヘッダにそっくり

あと今更するなら最初からしておけば何かとよかったのにね
夏休みの宿題を最後にためておく人だったのかな

一方静的型言語にも型推論とか取り入れられてるけど
こっちは文法的にも文化的にも何の障壁もなく導入されてるのが笑える
なにこの差
さらにはヌル安全とかまでやろうとしてる
逆にこっちのやってるのはいまだにネイティブスレッドww
何周遅れよこれ

そんでいつも後出しジャンケンで負ける
動的型もそう
後出しジャンケンして負けた
後出しジャンケンでも勝てばいいんだが負けたら意味ないね
Rubyサイコー
2019/08/05(月) 07:39:15.45ID:nl2V9bb60
>また、ソースコードと同一ファイルにアノーテーション(注釈、いわゆるコメント)として

この方式はmatzが滅茶苦茶に嫌ってるから採用される事はないね
あの人わけわからないぐらいこのことに固執してるからね

また何も知らないか、知ってても嘘をつく
いつものパターンね
2019/08/05(月) 13:40:37.89ID:nl2V9bb60
ちなみにmatzがソースコードに型を書きたくない理由だが
色々言ってるが、彼は詐欺師だから、本音ではないし、嘘も含まれる

まず
https://logmi.jp/tech/articles/321280
にも書いてあるし、たびたび登場するDRYに反するというやつ
言うまでもないが別ファイルに書く方がDRYに反するし
これは多分、彼の本音ではないし、煙に巻くための適当な言い訳

つぎに、静的型と動的型は振り子のようにトレンドが移り変わり
今後また動的型言語の時代が来るから、というもの
いやいやこれから先、動的型の時代など来ないだろうし、そもそもの前提がおかしい
C言語以降はずっと静的型の天下であり、動的型が勝ってた時代などなかった
振り子のようにというのがそもそも嘘偽り誇大表現、こうやって騙してくる
C/C++、Java、C#といった超メジャー言語にRubyが勝っていた時代など一度もなかっただろ、詐欺師め
2019/08/05(月) 13:43:49.85ID:nl2V9bb60
もう一つ
ここに書いてあることが実は本音(らしい)
https://jp.quora.com/TypeScript%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%9E%8B%E4%BB%98%E3%81%91%E3%82%92Ruby%E3%81%AB%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%89%E6%9C%80%E9%AB%98%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%AB%E3%81%AA%E3%82%8B
要約すると、Rubyに型アノテーションが導入されたら
型を書いた方が行儀が良いという風潮が蔓延するだろうが、自分は型を書きたくないので
そのために型をかけないようにしておく、というもの

良いことが出来ると、良いことをする風潮になるだろうが
自分は悪いことがしたいから、良いことが出来ると困る
と言っているわけで、マジキチなのがお分かりいただけるだろうか

法律があると法律を守らなければならないから嫌
信号があると信号無視が出来ないから嫌
と言ってるようなもので、まさに悪人の考え
型は書いた方が良い、とうことはしっかり分かってる上で
嫌だから出来ないようにしておく、と言ってるわけで、悪人独特の自己矛盾

しかし普段自分の都合のいいように嘘しか言わない彼が、本音を語っている点は評価できる
2019/08/05(月) 13:47:09.02ID:3mqInMrR0
そろそろこっちでやれ
アンチということではなく本スレの代わりとして
Rubyについて(アンチ専用) Part005
https://mevius.5ch.net/test/read.cgi/tech/1555162340/
2019/08/05(月) 13:52:01.39ID:nl2V9bb60
しかし>>569に書いたようなことを公式で言うとマジキチだから
静的型を導入しない理由を聞かれると、いつも適当なことを言って言葉を濁しているわけ
これでRuby3.0で導入されるといわれる型チェックが
どうしてああいう感じになってるか良くわかるでしょ
2019/08/05(月) 13:52:35.64ID:MNXFY7cg0
型を書きたくないんじゃなくて、Rubyの設計上、型を書こうとすると
設計レベルで作り直さなきゃいけなくなるから面倒くさいだけだよ。
573デフォルトの名無しさん (ワッチョイ ad7c-ONUK)
垢版 |
2019/08/05(月) 14:07:53.55ID:NOA3rn3w0
Perlも6で詰んだしな
*byも脱皮失敗で死亡
pythonは2->3でヨタヨタだがうまく離陸してくれ
2019/08/05(月) 14:08:47.58ID:kz1352lP0
単純に全体の完成度がバージョン0.8くらいに戻るよね
そこまでして「わざわざRubyに」導入するべきものでもないということではあろう
昔ならともかく今は他の言語もあるのだから
これ言うと揉めるけどな
2019/08/05(月) 14:14:45.71ID:MNXFY7cg0
1. 型を導入すると良いものになる。
2. だけど全体を再設計しなければならない。(面倒くさい)
3. その上、使いやすくすると、言語がガラリと変わる
4. ユーザーもその「使いやすい言語」に乗り換えるのが面倒くさい
5. 結果使われなくなるのがわかっている。
6. Ruby離れを防ぎつつ、型を導入するには、コレしかなかった
576デフォルトの名無しさん (ワッチョイ ad7c-TyxI)
垢版 |
2019/08/05(月) 14:23:24.52ID:NOA3rn3w0
型無し*byに不満な人はElixirやればいい
2019/08/05(月) 14:27:47.88ID:bU1KwNWi0
LISP や Smalltalk が好きな人にとって使いやすい Perl の代替となるスクリプト言語なんだから、型欲しい人は他の言語使えば? と言うだけの話。
型を導入すると対話環境での使い勝手が悪くなり、書き捨てのプログラムを書く際の手間が増える。それは楽しくない。

型を使うと速くなる? そんなに速度が要求される要件に使うなんて決定をする奴がおかしい。 型を使うとバグが減る? そんなにレベルの低い人は使わなければいい。
妥協できるラインが、今の、書きたいやつは書けば良いんじゃない?でも、文法を拡張して既存コードとの非互換生むような修整は受け入れられない。
と言う話でしょ。
2019/08/05(月) 14:32:38.11ID:bU1KwNWi0
>>576
そう。 Elixir なり Crystal なりを使えばいいだけの話。
なんでRubyに型を導入することにこだわるんだろう。
2019/08/05(月) 15:48:35.23ID:Umi2Ipdj0
ドキュメントに型を書くことになるんだから、そこの仕様をしっかり決めるべきだった
2019/08/05(月) 16:30:50.53ID:MNXFY7cg0
>>577
> 型を導入すると対話環境での使い勝手が悪くなり、書き捨てのプログラムを書く際の手間が増える。それは楽しくない。

それはstrictモードを作ればいいだけなんよ
2019/08/05(月) 16:33:24.89ID:MNXFY7cg0
>>577
> 型を使うと速くなる? そんなに速度が要求される要件に使うなんて決定をする奴がおかしい。
> 型を使うとバグが減る? そんなにレベルの低い人は使わなければいい。

その二つ、論点のすり替えだよね?

型を使うと速くなる? → それは事実 → だから人間の問題にすり替える。
型を使うとバグが減る? → それは事実 → だから人間の問題にすり替える。

事実ならまず「それは事実だね」って言ってみようか?
事実に対して反論するかと思いきや、反論しないんだもの(笑)
2019/08/05(月) 16:34:57.91ID:MNXFY7cg0
> でも、文法を拡張して既存コードとの非互換生むような修整は受け入れられない。

結局本音はそこ。

速くなるとかバグが減るという "事実" は存在するが、
既存コードの非互換性をうむから、改善できない。
2019/08/05(月) 17:42:09.05ID:bU1KwNWi0
>>581
型を入れてもオープンクラスな言語では大して速度は上がらない。精々一部のループの速度が上がるだけ。それは事実。java みたいに final や primitive 型入れれば効果は相当あると思うけど、それは Ruby を否定することになる。
型を入れると未熟なプログラマでもコンパイル時に分かる程度のバグなら発見できることはある。それは事実。でも実行時例外の回避は出来ないし、オープンクラスを使ったダックタイピングという Ruby の言語デザイン自体を否定することになる。

> 事実に対して反論するかと思いきや、反論しないんだもの(笑)

反論もなにも、自分はこのスレッドで >>344 >>577 >>578 しか書いてないよ。
だから、なんらかの反論を待ってるならその相手は自分ではない。

自分は Ruby に非互換を生む型の導入を期待するくらいなら、型有りの別の言語で書けばいいじゃんという立場。

>>580
この場合の strict モードって何を指してるの?
RPython 的に SRuby 作って型使いたい人は SRuby 使えってこと?同一バイナリにしてモード切り替えするとしたら、パーサも VM もほぼ別物レベルになると思うけど。
共有できるとしたら、pure ruby で書かれたごく一部のライブラリ程度じゃない?
2019/08/05(月) 17:55:40.47ID:MNXFY7cg0
型を入れてもオープンクラスな言語では大して速度は上がらない
→オープンでない言語なら速度は上がる
→速度を上げるためにはオープンでなくすれば良い
→そのような改善方法は存在するが、非互換性をうむから、取り入れられない。
→まつもと「Rubyでは改善はなんです。諦めてください」
2019/08/05(月) 17:55:56.86ID:MNXFY7cg0
→まつもと「Rubyでは改善は無理なんです。諦めてください」
2019/08/05(月) 17:58:22.53ID:MNXFY7cg0
>この場合の strict モードって何を指してるの?

適切な型を書いたものがstrictモード

だがどのオブジェクト指向でも、基底クラスのobject型として扱うことはできる。
暗黙的にobject型の変数を使ってるとみなしているのが今のRuby。

変数の型をobject型と書く(もしくは省略)か、適切な型を書くかの違い。
2019/08/05(月) 18:29:24.24ID:WUbT37Lx0
> 実行時例外の回避は出来ないし

は?
2019/08/05(月) 18:55:01.90ID:kCWOwKEP0
Rubyの癌は、型を指定できないことよりも、宣言ができないこと。
型を指定できないのは、宣言ができないことによる副産物。

宣言は、ここからこのオブジェクトを使うで、ということを明確にできてわかりやすいのに、何で嫌がってんだか。
2019/08/05(月) 19:04:12.59ID:bU1KwNWi0
>>586
strict モードにしたら
Class が凍結されるの?
途中でモードを切り替えられるの?
そのスコープは?
マルチスレッド時の挙動は?
Object クラス(Kernelも?)への継承関係がなくなるの?
データは VALUE 型じゃなくなるの?
オブジェクトのデータ構造は自分で C で定義するの?
既存CAPIとの整合はどう取るの?
そのコードを古いインタプリタに食わせたらどうなるの?
また分断するの?(想像するに1.4->1.6 や 1.8->1.9 より大きそうだけど)
strict にしたら何がどう変わるのかわからん。
過去に例示してあるのなら参照求む。

>>585
そう。 大抵の要望は Crystal で解決されてると思う。
速度欲しいなら Elixir 。もしくは C で FFI。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況