Ruby 初心者スレッド Part 62
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお Ruby on RailsについてはWEBプログラミング板で 前スレ Ruby 初心者スレッド Part 61 https://mevius.5ch.net/test/read.cgi/tech/1503644351/ るりまサーチ (リファレンス検索) http://rurema.clear-code.com/ Rubyist Magazine - るびま http://jp.rubyist.net/magazine/ 逆引きRuby http://www.namaraii.com/rubytips/ >>462 そのレスは何が言いたいのだ? そのレスの中身を教えてくれw rubyの可読性のよさには感動する DSLとかすごい たまーにendだらけになるのは難点w 動的にリファクタリングさせるコード書いてるけど、 書けないやつはrubymine使えば良くね? 配列の操作そのものが難しいと勘違いしてるんじゃないか? 配列の操作に使うコードって大概は下みたいに10行前後で書けるだろ class Array def acces(ary = []) return self if ary.empty? colect_int = ary.dup result = self[colect_int.shift] return colect_int.empty? ? result : result.acces(colect_int) end end 配列が苦手とか言われても パーサから順にイベントを渡されて処理するより明らかに難易度低いだろ 今のところ、リファクタリングについて誰ひとり説明できてないぞ? もっとシンプルに表現できるだろw >>458 数十レスも書いといて「リファクタリングとはこういうものだ」とすら書けない奴が何か言ってる。 毎朝7時8時から書き込める荒らしは何の仕事してるんや? RubyVM::InstructionSequence.compile("class Hoge end").eval のコードを実行したら直後に p Hoge.new って問題無く書けるのか コンテクストが別々だと勘違いしてた >>470 リファクタリングを理解してませんと認めたってことでOKだね >>472 俺は出勤が9時だからだよw 会社まで30分 >>466 > 配列の操作そのものが難しいと勘違いしてるんじゃないか? > 配列の操作に使うコードって大概は下みたいに10行前後で書けるだろ 書けてないだろ? それ何の処理するコードだよ [1,2,3].acces([]) => [1, 2, 3] [1,2,3].acces([1]) => 2 [1,2,3].acces([1,2]) NoMethodError: undefined method `acces' for 2:Integer from (irb):6:in `acces' from (irb):29 from C:/Ruby24-x64/bin/irb.cmd:19:in `<main>' お前がそれじゃ、配列は難しいという結論にしかならんぞ >>468 > 今のところ、リファクタリングについて誰ひとり説明できてないぞ? > もっとシンプルに表現できるだろw ソフトウェアの外部的振る舞いを保ちつつ、理解や修正が簡単になるように、内部構造を改善すること 補足を追加するならば、 振る舞いを保てていればいいので、アルゴリズムを変えてもOK というか、無駄があったりしてわかりにくいアルゴリズムを 理解や修正が簡単になるように書き換えることもリファクタリングの一つ 何が言いたいかというと、リファクタリングはパースした結果が 一致するように書き換えることではないということ パースできたからといって、リファクタリングができたことにはならない >>477 アンチスレへ帰れ おまえが働いていないのはわかったから >>479 いい加減学習しよう 422 自分:デフォルトの名無しさん[sage] 投稿日:2017/12/19(火) 01:06:10.31 ID:si5W7uAD [10/23] はっきり言わないと理解できないのかな? 俺はアンチスレには行きません 何度言われてもね >>480 初心者を騙していないではやくアンチスレへ帰れ デマばかり垂れ流しやがって 例えば、構造やサイズが変わる多次元配列の要素を辿って行く必要がある場合、 添え字だけ集めて一括指定で辿れる様にするのって普通? >>477 >ソフトウェアの外部的振る舞いを保ちつつ、理解や修正が簡単になるように、内部構造を改善すること オブジェクト指向知らないやつがググってコピペか・・・つまらん。 >>483 def pickup(a,b,c,d) a[b][c][d] end みたいな? あ、これじゃ次元数が固定だからダメなのか 文字列に対して ・0〜9の一桁の数であれば頭に0を付け足す(例:00,01 ・10以降はそのまま という処理を行いたいんですが、正規表現でスパッとかけたりするんでしょうか イメージとしては text = "9"なら09 text = "10"なら10 として出力(print)がしたいです gsubで置換できないか試しているのですがうまいこといかず・・・ アドバイス頂けますと幸いです 正規表現よりも sprintfフォーマットを使おう puts "%02d, %02d,%02d,%02d" % [1,5,10, 100] #=> 01, 05,10,100 sprintf "%02d" % 9 sprintf "%02d" % 10 ちなみにあえてgsubでやるなら '1'.gsub(/^(?=\d$)/, '0') #=> "01" '42'.gsub(/^(?=\d$)/, '0') #=> "42" %w(0 1 5 9 11 99 108 1024 16384).each do |x| p x.sub(/^([0-9])$/) { "0#$1" } # キャプチャを使った例 # p x.sub(/^(?=[0-9]$)/) { "0" } # 先読みを使った例 # p "%02d" % x.to_i # 整数値に変換して書式文字列を使った例 end "00" "01" "05" "09" "11" "99" "108" "1024" "16384" ありがとうございます!sprintf、こういう風に使えるのですか。便利ですね・・・ 正規表現での場合も教えていただきありがとうございました 勉強になりましたm(_ _)m >>493 すみません、ID変わってますが>>488 です 正規表現は後で泣くからなるべく使わないほうがいい。 もし使うのなら 複雑のは避けて シンプル+シンプルと組み合わせて使うといい。 おい >>466 配列操作簡単なんだろう? バグ修正はまだか? >>461 >俺はそんなことは言ってないので他人の意見だね いいや、もろに言ってるよ 君のレスに含まれるRubyという単語を改変してみた: >動的型付け言語が大変なのはソースコードを読むときだよ。書くときは比較的楽。 >楽の意味がわからないなら、タイプ数が少ないと言い換えても良い : >理由はまんまだが型という情報が書いてあるから。 >情報を多く書かなければいけない静的型付け言語は大変で >でも情報が多く有るから静的型付け言語はわかりやすい なんら違和感もないだろう?あいも変わらずごく当たり前な一般論を語っているだけ さあ、Rubyに限定されない「動的型付け言語におけるリファクタリング」を 語りたいのなら、このスレに粘着せず、>>107 で紹介した専用スレへ移動しなさい >>497 改変しておいて、俺が言ってるとか意味不明 改変しなければ、言ってないってことじゃないか 496から498までの自演を見てると小学生の演劇見せられてる気分になる って事で晒しage >>497 >>461 はたぶんちょっと勘違いしてる。 単純に静的言語はコンパイルである程度構文エラーを検出できるから楽を、 リファクタリングが楽だと思ってるんじゃないかな リファクタリングの考え方は言語は関係ないよ これでTypeScriptやPython方式の型ヒンティングが来たらコミュニティが大荒れするだろうな Ruby 2.5.0-rc1 リリース (12月14日) https://www.ruby-lang.org/ja/news/2017/12/14/ruby-2-5-0-rc1-released/ ★ 新機能 ★ * バックトレースおよびエラーメッセージが逆順に出力されるようになった (Railsゴリ押し?) * トップレベルにおける定数検索の削除 * rescue/else/ensure が do/end ブロック内にも直接書けるようになった * yield_self の追加 ★ パフォーマンスの改善 ★ (略... ★ その他の注目すべき 2.4 からの変更点 ★ * Onigmo 6.1.3 の取り組み (実際は Ruby 2.4.1 にて取り込み済み) * bundler の取り込み その他略... 詳細は https://github.com/ruby/ruby/blob/v2_5_0_rc1/NEWS に書かれてる ☆彡 ☆彡 ☆彡 ☆彡 ☆彡 第三者の記事: * サンプルコードでわかる!Ruby 2.5の主な新機能と変更点 https://qiita.com/jnchito/items/f182b6f0093a6a3701a1 >>500 > 単純に静的言語はコンパイルである程度構文エラーを検出できるから楽を、 > リファクタリングが楽だと思ってるんじゃないかな 違うよ。静的型付け言語の場合が簡単なのは、 ソースコード上に型が書いてあるからだよ コンパイルエラーは関係ない 例えば class Klass { (間違って途中で送信した) 例えば class Klass { function foo() { } } みたいなクラスがあって、 fooをbarに書き換える時 ↓ このように型が書いてあれば、ここのfooもbarに 書き換えなきゃいけないとわかる function f(Klass k) { k.foo(); } ↓ でもこの場合は、書き換えれば良いのかわからない function f(k) { k.foo(); } ソースコード全体から、fを呼び出している所をすべて探して 引数にKlassクラス(もしくはそれを継承したクラス)を 渡していることを確認しなければいけない 今回は一番簡単な例としてメソッド名の変更を例にしたが 例えば、メソッドの引数の数が変わったときも 型がわかれば、メソッドが特定できるので、変えなければいけない場所がわかる メソッドが消えたこともわかる クラス名で検索すれば、そのクラスを使ってるモジュールもわかるしね シグネチャの変更に関わる部分は、静的型付け言語の場合は すごく簡単に変更すべき場所を特定できる Rubyの静的解析の難しさに関して言えば、単にソースに型が書いてないというだけではないんだよなあ Rubyって、静的なクラス定義というのがそもそも存在しないんだよ 動かしてみて、RubyのVMのメモリ上に結果としてクラスオブジェクトができて、そこではじめてクラスが定義されたことになるの この式のクラスは何か?とか考える以前に、クラスなんてものは動かしてみるまで無いの そう。それもあるね。 動くか、動いてないかの二択じゃないか?って 思うかもしれないがぜんぜん違う。 動いてない状態というのは一つしかないが、 動いている状態というのは無限に近い数ある 「0」と「0以上」の違いと同じ 動いてないという一つの状態なら、全部を調べることも可能だが、 動いているという無限にある状態は、調べ上げることは不可能 >>498 Rubyの箇所をJavaScriptやPythonといった他の動的型付け言語へ 改変しても当てはまる事柄しか語っていないと指摘しているんだよ 以下 >>506-509 まで、Rubyには限定されないありふれた一般論が続く >>501 つまり、そうゆうこと >>511 >Rubyって、静的なクラス定義というのがそもそも存在しないんだよ これも「動的型付け言語って、静的なクラス定義というのがそもそも存在しない」という話だね Rubyに限らずJavaScriptやPythonといった他の動的型付け言語であれば、 「クラスなんてものは動かしてみるまで無い」のが動的型付けの原理だよ 「クラスなんてものは動かしてみるまで無い」かもしれないが、 「仕様(やりたいこと)は動かしてみなくてもある」 ソースコードは動かさなくても「そのクラスは○○であること」 (○○にはメソッドが有ることとかはいります)を前提に 書いてあるというのに「動かしてみるまで無い」ことに意味があるのだろうか >>513 がRailsを触ったことがないのはわかった >>514 反論して良いんだよ? Railsがなんだって? 普通はデータベースにそのフィールドが 有るという前提でコード書くよね? >>515 それをどうやって実行前に認識するの? DBのスキーマをクエリして調べるのか?w >>516 DBのスキーマを実行時に変えたりすることなんてまず無いだろ 実行前にスキーマは決まってる。 ならクラスも実行前に生成することは可能なわけだが? Railsが実行後に決めているからと言って、実行時に決まることにはならない スキーマは実行前に決まっているし、今話してるソースコードだって そのフィールドが存在するという前提のソースコードを書いてるだろ 動的に生成してるその情報は、本当は実行前に決まってるんやで? 可能かどうかとやるかどうかは別問題だろう それRuby3の型検査の仕様として提案してみろ、このスレどころではなく罵倒と嘲笑の的だぞ >>518 これのどこが型検査の仕様なんだ? そりゃ馬鹿にされるだろうな 型検査の仕様だと言ったお前が 動的言語といっても本当に動的に決まることはほとんどなく 静的に決まってる情報を元に動的に作ってるだけなんだよな。 だから実行するたびに毎回同じものが作られる。 毎回同じものを作るなら、キャッシュするかのように 最初から作っておけば良いわけさ >>519 DBスキーマまで考慮したメタプログラミング対応の静的解析ツールを作るってこと? 実用的なものができると本気で思うなら作ればいいんじゃね? みんな喜ぶし、そんな実績があればそれこそMRIの主要メンバーとしてRuby3の仕様決定を主導できるぞ 頑張れよ >>521 だから動的言語の仕様じゃ無理だって話してるじゃんw ソースコードにクラスという型を書いてあるから多くのリファクタリングが簡単に出来るようになる 静的に決まってるならソースコードに静的に書けるわけで、 静的に書いておけば、リファクタリングが簡単に早くできるって話をしてる >>522 だからそれはRubyだけでなくJavaScriptやPythonを含む 大半の「動的型付け言語じゃ無理だ」っていう当たり前の話だろ? >>522 のその論理はもういいよw 食いたくないのに食わされてお腹いっぱいっすわ リファクタリングはシンプルにしていくのが目的なのに、話を小難しく複雑にしたいのはなぜだ >>512 とか。 動的言語うんぬんゆってるやつから不吉な匂いがする >>526 リファクタリングは、シンプルにしていくのが目的 だから、話を小難しく複雑したくない? シンプルにしたいのはリファクタリングであって 「話」の話は関係ないよ このスレはいっつも議論してんなぁ みんな日中は何してる人なの? 普通に仕事してるよ。 だから平日の日中は書き込めない Rspecで下みたいな書き方ってあり? それとも避けられる? # def f n # n + n # end context 'fの引数が0から255のとき' do ??256.times do |i| ????it { expect( f(i) ).to eq (2 * i) } ??end end >>531 テストの一般論で言えばダメ それ結局同じことを実装とテスト両方に書いてるだけで、テストとして意味をなしてない テストは入出力ともどんな低脳か見ても間違えようのない具体的な値を書くのが鉄則 >>532 じゃあもし0から255まで全部パスするか書きたいときは it { expect( f(0) ).to eq (0) } it { expect( f(1) ).to eq (2) } ... ってズラっと列挙しろってこと? あと、「nの2倍を返す」という観点と「入力は0から255まで」という観点がごっちゃになってるのも良くない この場合、前者を代表値(5とか)でテストして、それに加えて後者の観点で境界値(0と255)を試すくらいでいいと思うよ 代表値は冗長かもしれないけど前者の観点をわかりやすく表現するという意味では価値はある >>534 なるほど、どうもありがとう 代表値、境界値(+不正な値)を試すくらいでいいんだね 荒らしがハッスるしとる やっぱアンチも人のいないアンチスレより人の多い本スレに来てしゃべりたいのか かわいそう あ、いや、いままでとちょっと違うことを書き込もうと思ったけど ID変わってたかなーって思っただけ 変わってなかったので違う話はしないよw あと他のスレには行かないと何度もいってる あきらメロン https://rubyinstaller.org/downloads/ Windows10 に、Ruby を入れようと、 上のページの、7-Zip Archives から、Ruby 2.4(x64)をダウンロードすると、 rubyinstaller-2.4.3-1-x64.7z というファイル名だった。 これを、7-Zip で解凍すると、56MB になった C:\Ruby24-x64\ とフォルダ名を変えたけど、ここからどうやってインストールするの? それとも、これはインストーラーではないのかな? 圧縮された書庫だから、7-Zip Archives から、Ruby 2.4(x64)をダウンロードしたけど、 これはインストーラーとは違うものなのか? rubyinstaller-2.4.3-1-x64.7z というファイル名だったけど 7-Zip Archives の上にある、RubyInstallers から、Ruby 2.4(x64)をダウンロードしてみるわ PowerShell で、7-Zip Archives 中の、\bin\ridk.ps1 version を実行してみた PS C:\Ruby24-x64\bin> .\ridk.ps1 version --- ruby: path: C:/Ruby24-x64 version: 2.4.3 platform: x64-mingw32 ruby_installer: package_version: 2.4.3-1 git_commit: 36aac73 os: Microsoft Windows [Version 10.0.16299.125] やっぱり、これも、RubyInstaller なのかな? よくわからない Rubyにパイプラインオペレータってないの? JavaScriptだと exclaim(capitalize(doubleSay("hello"))); というカッコの入れ子が "hello" |> doubleSay |> capitalize |> exclaim; とシェルスクリプトのパイプのように 流れるような形で記述できるようになるらしいんだけど >>545 そんなのがあると誰もオブジェクト指向しなくなるからRubyの思想には合わないだろ 素直にメソッドチェインでやるか、さっさと関数型言語に乗り換えるべき 7-Zip Archives からダウンロードした、Ruby 2.4(x64)は、 ひょっとして、CUI 版のインストーラーなのかな? (rubyinstaller-2.4.3-1-x64.7z というファイル名だった) 7-Zip Archives 中の、\bin\ridk.ps1 に引数を付けて、 インストールするのかも知れない よくわからないけど。 インストーラーじゃないかも知れないし >>545-546 まさに、Elixir Matz も、Streem という新言語を考案して、日経Linux に連載していた。 GitHub にあるらしい 7-Zip Archives から、Ruby 2.4(x64)をダウンロードすると、 rubyinstaller-2.4.3-1-x64.7z というファイル名だった。 これを、7-Zip で解凍すると、56MB になった 56MB もあるし、\bin の中には、ruby.exe, rubyw.exe もある。 実行環境が揃っているような気もする 実はポータブル版で、環境変数PATH を通せば、実行できるのかも知れない よくわからないけど、何か捨てがたいw PowerShell で、7-Zip Archives 中の、\bin\ruby.exe -v を実行してみた PS C:\Ruby24-x64\bin> .\ruby.exe -v ruby 2.4.3p205 (2017-12-14 revision 61247) [x64-mingw32] やっぱり、7-Zip Archives の中にあるやつは、ポータブル版じゃないのか? ひょっとして、実行もできるかも? 実行できて当たり前なのに何を言っているのか インストーラーはパスを通したりするだけだぞ 7-Zip Archives からダウンロードした、Ruby 2.4(x64)は、 環境変数PATH が通っていないだけで、実行できるの? ここに、実行環境が一式が揃っているの? つまり、どこにでも移動できるポータブル版? >>548 期待したけど、やっぱりRubyの文法からは抜け出せないか DSLが得意と言っても所詮Rubyの言語であることに変わりはないしな >>546 まあ頭が固いw a + b はオブジェクト指向じゃないっていうんですか? a.add(b) ってしなきゃいけないですね >>555 Rubyに文句を言う前にまずはRubyの仕様くらいちゃんと理解しよう +は全く特別なところのないごく普通のインスタンスメソッド呼び出しだぞ 関数型でaddにパイプライン使うとしたら b |> add(a) # add(a, b)に相当 こうなるわけだが、理解してるか? >>556 まあ君はJavaScriptの仕様を知らなくて当然だろうけどね |> オペレータっていうのは、引数を一つの関数呼び出しの シンタックスシュガーに過ぎない だから関数呼び出しを行ってるのと一緒 関数呼び出しをするとオブジェクト指向にならないのか? そんなわけあるかw >>557 ある機能が言語に追加されることでコーディングのスタイルが大きく変わってしまうことはよくある。 まあそういう経験則的な話は君には通じなそうだから、もっと具体的にRubyとの相性の悪さを説明してあげよう。 まず、関数型言語やJavaScriptでは裸の関数名は第一級関数(関数オブジェクト)だが、Rubyではメソッド呼び出しになってしまう。 だから>>548 のようにシンボルを使った汚いハックをするか、|>の後にくる識別子は第一級関数として扱うという特別ルールを設けることになる。 特別ルールを設けたとしても、>>556 のaddの例みたいな使い方には対応できない。 君は関数型言語を知らないみたいだから説明しとくと、add(a)はadd関数の第一引数にaを部分適用(カリー化)した引数一個の関数を返す。 |>の直後には必ず関数名が来るというルールだと、これは実現できないのはわかるよね。 それと、Rubyの関数は殆どがインスタンスメソッドであるというのも忘れてはいけない。 x |> y.hoge これは y.hoge(x) と解釈すべきだろうか? それともy.hoge()(x)かな? 今のRubyの仕様からすると後者が自然だと思わない? ようお前ら。 Ruby 2.5が来るのは明日だぞ。 gem作ってる奴はちゃんと準備出来てるか? Ruby2.5にした途端に泣きを見ることのないようにしとけよ。 >>558 あ、なるほどw シンタックスシュガーって言ってるのに、 あんたは関数型の仕様に変更すると思い込んでるわけかw 俺、Rubyを関数型にしろなんて一言も言ってないよ? JavaScriptが関数型になったなんて一言も言ってないよ? ただ、関数呼び出しのネストは見づらいから、一つの引数を取る関数の呼び出しを |> でつなげた "書き方" ができると良いねって話しかしてないんだよ > 今のRubyの仕様からすると後者が自然だと思わない? 理由が書いてないから判断不可能だね >>556 > 関数型でaddにパイプライン使うとしたら > b |> add(a) # add(a, b)に相当 > こうなるわけだが、理解してるか? ぷぷw |> という記号を使っだけで、関数型になるべきだなんて 思い込んでるからそういう結論になる。馬鹿だねぇ JavaScriptの関数型でない単なるパイプラインオペレータは引数が1つの 関数を受け取ることしかできない。 カリー化?そんなものはしない。 関数型のパイプラインオペレータを導入なんて話はしてないんだから当然の結論 引数が複数の関数を使いたければ、アロー関数でそうなるように書くだけの話 https://github.com/tc39/proposal-pipeline-operator let newScore = person.score |> double |> (_ => add(7, _)) # アンダースコアは只の変数、iでもaでも良い papp proposalのpappメソッドを使うとこう書くこともできるようだけど let newScore = person.score |> double |> add.papp(7) >>554 Ruby使うんだから当たり前の話でそ? Rubyじゃないスタイルでどうしても書きたいならすでにRubyを使う必要はないと思うんだけど ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる