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/ >>309
>リファクタリング:Rubyエディション、2010
を読むまでは俺もお前と同じ勘違いをしてた
どのような言語でもテクニックとしてリファクタリングが出来るという事が書いてあるから一度読め
特にrubyは、その記述性からリファクタリングテクニックがぴったり合う >>310
できるかどうかでいえばできるでしょ
正しさを保証できないだけ リファクタリングテクニックを適用するだけの事に、正しさの保障とか難癖つけても無駄
俺も以前は、カン違いしていた口だから偉そうな事は言えないけど >>309
Rubyにリファクタリングが合わないならリファクタリングrubyエディションなんて書籍は出版されないのでは?
内容も、何も考えなくても機械的に適用すればリファクタリングが出来てしまうテクニック集の例示だし
それと故意に話しを摩り替えられたけど聞きたかったのはリファクタリング関連のgemの事 Rubyってどこまでできたら初心者卒業って言っていいの? なんかできるできないの話に持っていって(持って行かれて?)
負けてるやつがいるなw
Rubyでもなんでもリファクタリングはできるよ。
ただ同じリファクタリングをしても時間がかかる言語と
そうでない言語があるって話 >>313
こんなにRuby信者が寄ってきてるのに何一つ出てこないことが何よりの答えだろうね
そもそもRubyってツールでコードを弄るのをダサいと考える文化があるのよ
コードを生成するくらいならメタプログラミングで実行時に何とかするべきだし、
ツールで機械的に適用できるような局所的なリファクタリングなら手でやったほうが早い、っていうのがRuby的な思考
静的言語のIDEに付いてるようなインターフェイスの抽出とかメンバのリネームといった広域的なリファクタリングは便利なものだけど、
ああいうのは実際「原理的に困難」なので >>316
>>317
ネガキャン失敗して顔真っ赤にしながらレスを書いていると思うと最高 有能なRubyistである>>318がパッと作ってgithubのURL貼ればそれで済む話だぞ
Matzもコードで語れっていつも言ってるでしょ >>319
逃げ回っていないでruby-devかruby-listで発言して来いよ リファクタリングと言えばrubyでRipper使えばコードを構文木化して扱えるよ
だから処理系自身にrubyコードを書き換えさせる事も出来る
それからgemもparseなんちゃらみたいなのが結構出てくるから割とありきたりなネタ
知ったかで騙ってる荒らしだけが無知を披露中 文脈がわかるわけじゃないからちょっと無理があるけど またまたネガキャン大失敗の巻きか?
プゲラッチョ 構文木ってソースコードのDOMでしかないからなあ
>>322も言ってるけどそれでコードの意味がわかるわけじゃない
しかもRubyのASTの場合、静的解析やコード生成ではなく実行することしか考慮されてなくて、
CALLとシンボルだらけで大幅に情報が失われてる
自分でやってみりゃわかるけどかなり扱いづらい代物だよ --dump=parsetreeオプションか、--dump=insnsオプションで使わないの? >>325
dump=parsetreeの結果から元のソースを復元してみ
無理だから 使いづらいって言われてもそれは主観でしかないよな?
しかも実質、リファクタリング関連のgemを製作する側がどうのこうのであって、
gem利用者には関係なくない?
そもそも他言語での自己書き換えの扱いはもっとやっかいだぞ? 一応補足しとくけど、ruby処理系にそういう機能があるかどうかじゃなくて
dump=parsetreeで出力されたASTから元のソースを復元するツールを作ってみてくれ、という意味だぞ
ちなみにripperでも同じだ
もちろん細かいスペースの差異とかは無視するとしても、不可能なのがわかるよ
リファクタリングや静的解析に使うなら処理系付属のは使い物にならないので専用のASTが絶対に必要だ 構文木と並行して字句解析つかえば何も問題ないぞ
というか、そういうgemがごろごろあるぞ?
また知ったかしちゃったのかな? >>329
意味不明だなあ
字句解析の結果をどうやってASTに紐付けるの?
結局独自に構文解析するんなら、それはつまり「専用のASTが必要」ということになるわけだけど、
自分で言ってること理解してる? 荒らしはrubyでリファクタリング出来る事が物凄く不満らしいけど、親でも殺されたのか?
これでも読んで落ち着け
つリファクタリング:Rubyエディション、2010 >>330
だからgemがごろごろあるだろ
現実に存在するgemを否定しても現実は変わらんぞ?
そもそも妄想を騙るならruby-devかruby-listで発言しろ
ここはおまえの妄想ノートじゃねよボケ リファクタリングはどの言語でもできる
ただやりにくい言語とそうでない言語が有る
Rubyはやりにくい。時間がかかる いや、まちがっていない
こいつはいつもの粘着荒らしだ 俺には>>336もプロレスの自演に見えるけどね
批判的意見に毎回バカっぽく突っかかって論破されてる噛ませ役 リファクタリングって頭空っぽにして代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
なんで時間がかかるとか難しいとか話しが出てるんだ? リファクタリングが何か知らない奴が混じってて必死でrubyのネガキャンしてるだけ
ruby-devやruby-listだとすぐ嘘がばれるから
もうこの荒らしは排除いいよ >>339
> 代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
> リファクタリングって頭空っぽにして代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
> なんで時間がかかるとか難しいとか話しが出てるんだ?
代数的に適用するためには、十分な情報が必要だからだよ。
例えば2つの数値の掛け算の答があったとする
その答から、なんとなんの数値の掛け算かを求めるのは大変
答が複数あることもあるからだ
だけどそのうちひとつの数値がわかっていれば、答はすぐに分かる
型にも同じ話が言える。静的型付け言語の場合は、変数に型が定義されているから
そこから代数的に安全にコードを変えられるテクニックが使える
だけど型がわからなければ、そこから代数的に安全にコードを変えられるテクニックが使えない。
だから時間がかかる。一部の人はそのことを”できない"と表現しているがj。
それは違う。いくつもの可能性を検討して、これだ!と安心できるまで時間がかかるのだ。 また自演の長文か
そんなに主張したい事があるなら初心者スレじゃなくruby-devかruby-listで言え
わざわざ初心者スレで嘘をばらまく必要は無いだろう リファクタリングにちなんで、
みんなはコードに自己書き換えの処理させる時って何を使ってる? 初心者スレでイキってる荒らしはこういう質問が来ると急に大人しくなるんだよな
俺は普通にdefine_methodを使うぐらいしかしていない 自演かな?
>>344が答えてるのに、質問に応えられる人がいないなんて え? その前に俺の>>342のレスに答えてよ
おとなしくなるって、俺のレスに答えられなくなるって
話だと思ったよ ソースを直で修正し再ロードして実行までをrubyコード内で記述できるわけだから、
言ってしまえばなんだって出来る
gemでparse2rubyとか色々あるし >>349
ID:Hi83U6qj「俺はID:BeMxy3i4だ」と言われても、
スレを妨害してるのはお前しかいないんだが >>349
いつまで逃げ回る気だ荒らし
本人確認するかruby-devかruby-listで早く発言しろ
>>351
Ripper.sexp_rawで良い具合にメソッドを書き換えて使ってる 「ruby-devかruby-listで発言しろ」って言いまくってる奴は単発IDでの自演常習犯だから絡まないでスルーしましょう
>>252でも説明したけど自治の振りをした粘着荒らしです 自演を繰り返す荒らしがスレ住民全員を荒らし認定か
ruby-devかruby-listで発言するのがそれほど怖いのかな? 妨害って何? Rubyの話ししてるでしょ
>>341へのレスしてくれるのを待ってるんだが? >>351
それ間違えたw 本当は>>341と書くつもりだった
透明あぼ〜んされてて見えなかったから
ずれてしまったのかな? ちょいと質問です。
Cだと"__"から始まったり、"_"+大文字となったりする識別子は予約扱いだと明文化されてるけど、Rubyはどうなのかちょっと気になってます。
組み込みで__FILE__ __LINE__ __method__とかが定義されているのは知ってます。
gemライブラリの中で2つのアンダースコート"__"から始まり、同じく"__"で終わるメソッド名を定義しようかと考えてるけど、問題ないかなと思って。 @で始まる変数はインスタンス変数
@@で始まればクラス変数
$で始まれば組み込み変数
大文字で始まれば定数
selfもnilもtrueもfalseも変数 リファレンスで擬似変数の所を見てかぶりそうなのをさければ問題ない
かぶっても見分けられるなら問題ない Ripper.sexpつかえばソースの自己書き換えできるだろ
誰だよ出来合ないって言ったのは require "ripper"
require "pp"
pp Ripper.sexp("class Foo p self end")
#[:program,
# [[:class,
# [:const_ref, [:@const, "Foo", [1, 6]]],
# nil,
# [:bodystmt,
# [[:command,
# [:@ident, "p", [1, 10]],
# [:args_add_block, [[:var_ref, [:@kw, "self", [1, 12]]]], false]]],
# nil,
# nil,
# nil]]]]
これでリファクタリングが難しいとか時間がかかるとか言ってた奴もいたな >>363
読む時間も含めれば、時間かかるんじゃないの? >>365
何を言ってるの?
リファクタリングっていうのは人が
どうすべきかを考えるんだよ
今何が問題で、どうすべきかを考えるためには
ソースコードを読んで理解しなければならない。
その理解するまでの時間の話なんだけど
で、そのコードをどうしたいのか俺には分からん
まずそこからだよね。君が説明するべきことは メソッド抽出、インライン化、メソッドシグニチャの変更と、
IDEにある主なリファクタリング機能なんだが
これをrubyには出来ないと言ってた奴が居るらしい >>360
ありがとう。
かぶったらその時ってことで突き進みます。 Kernelモジュールに__で始まるメソッドがあるからそれにも気をつけろ
わからないことがあったら一度自分でリファレンスを検索して細部までしっかり見ろ >>367
メソッド抽出はできるけどインライン化やシグニチャの変更は安全には行えないよ
実際にどのメソッドが呼ばれるかは実行してみるまで分かんないし、メタプログラミングでメソッドが存在しない場合すら珍しくない シグニチャの変更は、Ripper.sexpからの配列をまわして旧シグニチャを指定のに書き換えてソースに戻せば良いように見える
そもそもrubymineで出来る
インライン化なんて普通に:assign部分を使われてるところで展開すればいいだけだからシグニチャの変更より楽そう
逆に変数の切り出しも出来るだろこれ
ちょっとコードを書いてみるか ElectronみたいにWebベースでGUIを作ってRubyで動的処理を行うフレームワークとかないんかな
ActiveScriptRubyは近いけどWin/IE限定の上にRScriptをインストールする必要があるのがイマイチ
インストール不要で軽量・軽快なのが欲しい >>371
名前が一致すれば同じメソッドと見做すの?
とんでもないコードクラッシャーになるな 結局Rubyでは候補を出すところまでしかできないんだよね
代数的に適用することができない
その変更が正しいかどうかをコード全体を読んで
考えないといけないから、時間がかかってしまう >>367
> メソッド抽出、インライン化、メソッドシグニチャの変更と、
> IDEにある主なリファクタリング機能なんだが
少ないね ID:Hi83U6qjのレスは矛盾だらけだな
最近の荒らしはこんなに程度が低いの? アンチが出たならアンチスレへ誘導をしろ
そのためのアンチスレなんだから
>>378
Rubyについて(アンチ専用) Part004
https://mevius.5ch.net/test/read.cgi/tech/1249737531/
ほら、アンチスレがあるんだからもう来るなよ
そこなら好きなだけネガキャンしても嘘ついても誰も文句を言わないから 喧嘩ふっかけといてアンチスレに逃げるわけないよね?w 2ch学習法(今なら5chか)って言われてたやつが通じると思ってるんだろうけどな。 初心者スレはスレ消費激しいけどアンチスレはぜんぜん流行ってないな
アンチ死んでる? pythonが流行ってるからなあ。本もpythonばっかり >>371を参考にしたらリファクタリング機能を組めた
ソース読み込んでS式書き換えてソースに書き戻すって処理だけど俺でも簡単に出来るんだな こっちでは問題にすらなってない
俺ですら出来るレベルだけど、それでも無理ならVMにバイトコード見せてもらったら? >>387
そんな事も分からないお前が無能なだけ
もう来なくていいぞ [:var_ref, [:@kw, "self", [2, 0]]]みたいなノードがありそれを上にたどって行くとselfが何か判る
S式は慣れれば読めるし、処理も楽 入れ替えることができちゃうから実際には単純にはいかないってことを言いたかっただけ >>390
問題は、それが分かってもリファクタリングできないってことなんだよね いや、
リファクタリング前のソースコード からS式を作って
そのS式から「リファクタリングされたソースコードを生成して見せる」って
言うのならどうぞwどうぞw って話だけど
可能不可能の話なら可能。だけど大変すぎなのでやらない
それを「リファクタリングできない」っていう表現で>>392は書いた >>393
いや正確に再現するのは不可能だよ
1+1とかダンプしてみ >>394
俺もS式から(可読性が高い)リファクタリングされた
ソースコードを作り出すのは不可能だと思ってるよw
だからダンプするまでもない
何が言いたいのかって言うと、リファクタリングの話題で
S式、S式、って何が言いたいんだこいつ?ってこと
S式はリファクタリングと何の関係もありません S式から可読性が悪い変なソースコードに変換することはできるだろうが
そりゃリファクタリングと真逆な行為だしな そうそう
ripperのASTはコード生成には不向きであると言ってるだけで、別にRubyを否定しているわけじゃないのに何を必死に喚いてるんだろうね
コード生成に関しては、単に「文法上の同値の解釈」を一切入れない、より低レベルなパーサを作って正確なASTを得らればいいだけのことだ
動的型だって静的型にはない良さが沢山あるのに、アンチ連呼君はそこを無視して「静的型にできることは全てRubyにもできる」という無茶な主張を続けている
そうやって本質を理解しないまま無理筋で反論するから馬鹿にされるんだといいかげん気付け 初心者だからRubyとPythonの違いがわからんのだけど、どう違うんだ?
Rubyがもっと流行ってもいいと思うんだけど おいアンチ、
初心者騙してないでいい加減アンチスレに帰れよ
おまえがリファクタリングできないのは判ったから 自分でうまくソースコードに書き戻す処理が書けないのをRubyの所為にしてはダメだろう
どうしてもやりたい場合はRipper2rubyってgemを使え 可能不可能の話に持っていくから(わざとやってる?)
話がややこしくなるんだよ
構文解析は、静的でも動的でもできる。
その時、どれだけの情報を得られるかっていうのは
型情報を書いてある静的のほうが多いのは明白
(動的のメリットは書かなくて良いことなんだから、動的の方が多くなることはない)
静的のほうがより多くの情報を得られる。
それがリファクタリングをする上での情報の多さにつながり、
リファクタリングを自動化する上での情報にもつながる。
静的のほうが予め書いておく情報が多い分、静的解析でわかることが多い。
動的だとわからない情報は、人がコードを見て推測するしかない
人の作業は遅い、リファクタリングの速度につながってくる
リファクタリングが可能か不可能かの話じゃない
作業する時の速度の話 素直にgemのripper2rubyを使え
おまえには無理だから もちろんripper2rubyはリファクタリングをするためのgemではない rubymineを使ってないの?
リファクタリングは簡単だよ 俺が言っても信用しないのだろうから、
http://washiiku.hatenablog.com/entry/2014/12/19/054914
> 上に書いたように変数の型をエディタが察してくれるので、
> 対応するメソッドなどにジャンプしたり、逆に使用されている
> 箇所も一覧で表示できます(ただし静的言語ほど正確ではない)
> JetBrains系ではお馴染みですがリファクタリングが便利です。
> スコープ内の変数名の変更が定番ですが、クラス名などグローバルな
> 名前は型情報からプロジェクト全体のリファクタリングをしてくれます。
> (上述したとおり静的言語ほど正確ではないので、大規模な変更は実用的ではない)
この正確でないというのが問題で、結局人が判断する部分が多くなる。
大規模な変更は実用的ではないのは何故かと言うと
大規模=変更箇所が多い=人が判断する場所が多いので
正しいこと判断するのが大変 https://twitter.com/nagise/status/890031111828414464
RubyMineもかなり頑張ってくれるんですが、それでも原理的に限界があるので、
使った場合、漏れがあったり、あるいは過剰に変換してないか確認が必要だったりしますね(自分の経験上)。 出来る出来ないの話じゃないって自分で言い出してからまだ30分も経ってないのに、
出来る出来ないの話に戻したな
これでは誰もアンチを信じてくれないわ 動的言語がなぜリファクタリングに弱いかというと
いつクラスの定義が定まるかを考えてみればわかる
まずリファクタリングというのはソースコードを修正する
そしてクラスの定義はソースコードから生成される
この時、ソースコードからクラスの定義が単純に決まれば良いのだが
動的言語では、実行するまでクラスの定義が決まらない
ならば実行すればいいと思うかもしれないが、何をどう実行すれば
クラスの定義が定まるのかを知る方法がない
つまりクラスをリファクタリングする場合、
クラスの完成形を知ることができないので、
人間が判断するしかなくなってしまい時間がかかる >>409
長文はいいから自分のスレへ帰れ
ここはおまえの日記帳じゃない ■ このスレッドは過去ログ倉庫に格納されています