X



Ruby 初心者スレッド Part 62

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/11/24(金) 00:35:29.31ID:rLZHdQ3Q
プログラミング言語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/
0310デフォルトの名無しさん
垢版 |
2017/12/15(金) 13:34:32.77ID:AXI+pgWQ
>>309
>リファクタリング:Rubyエディション、2010
を読むまでは俺もお前と同じ勘違いをしてた
どのような言語でもテクニックとしてリファクタリングが出来るという事が書いてあるから一度読め
特にrubyは、その記述性からリファクタリングテクニックがぴったり合う
0312デフォルトの名無しさん
垢版 |
2017/12/15(金) 22:04:52.20ID:AXI+pgWQ
リファクタリングテクニックを適用するだけの事に、正しさの保障とか難癖つけても無駄
俺も以前は、カン違いしていた口だから偉そうな事は言えないけど
0313デフォルトの名無しさん
垢版 |
2017/12/15(金) 23:07:30.00ID:XFw1hYkv
>>309
Rubyにリファクタリングが合わないならリファクタリングrubyエディションなんて書籍は出版されないのでは?
内容も、何も考えなくても機械的に適用すればリファクタリングが出来てしまうテクニック集の例示だし

それと故意に話しを摩り替えられたけど聞きたかったのはリファクタリング関連のgemの事
0316デフォルトの名無しさん
垢版 |
2017/12/16(土) 01:25:30.77ID:plaGBrRo
なんかできるできないの話に持っていって(持って行かれて?)
負けてるやつがいるなw

Rubyでもなんでもリファクタリングはできるよ。
ただ同じリファクタリングをしても時間がかかる言語と
そうでない言語があるって話
0317デフォルトの名無しさん
垢版 |
2017/12/16(土) 01:59:08.24ID:SSRXngMG
>>313
こんなにRuby信者が寄ってきてるのに何一つ出てこないことが何よりの答えだろうね
そもそもRubyってツールでコードを弄るのをダサいと考える文化があるのよ
コードを生成するくらいならメタプログラミングで実行時に何とかするべきだし、
ツールで機械的に適用できるような局所的なリファクタリングなら手でやったほうが早い、っていうのがRuby的な思考
静的言語のIDEに付いてるようなインターフェイスの抽出とかメンバのリネームといった広域的なリファクタリングは便利なものだけど、
ああいうのは実際「原理的に困難」なので
0318デフォルトの名無しさん
垢版 |
2017/12/16(土) 05:32:22.64ID:2bqvN76b
>>316
>>317
ネガキャン失敗して顔真っ赤にしながらレスを書いていると思うと最高
0319デフォルトの名無しさん
垢版 |
2017/12/16(土) 14:05:47.39ID:VgVQwchc
有能なRubyistである>>318がパッと作ってgithubのURL貼ればそれで済む話だぞ
Matzもコードで語れっていつも言ってるでしょ
0321デフォルトの名無しさん
垢版 |
2017/12/16(土) 23:26:30.07ID:RIeUS8wT
リファクタリングと言えばrubyでRipper使えばコードを構文木化して扱えるよ
だから処理系自身にrubyコードを書き換えさせる事も出来る
それからgemもparseなんちゃらみたいなのが結構出てくるから割とありきたりなネタ

知ったかで騙ってる荒らしだけが無知を披露中
0323デフォルトの名無しさん
垢版 |
2017/12/16(土) 23:47:36.74ID:2bqvN76b
またまたネガキャン大失敗の巻きか?
プゲラッチョ
0324デフォルトの名無しさん
垢版 |
2017/12/16(土) 23:58:10.67ID:VgVQwchc
構文木ってソースコードのDOMでしかないからなあ
>>322も言ってるけどそれでコードの意味がわかるわけじゃない
しかもRubyのASTの場合、静的解析やコード生成ではなく実行することしか考慮されてなくて、
CALLとシンボルだらけで大幅に情報が失われてる
自分でやってみりゃわかるけどかなり扱いづらい代物だよ
0325デフォルトの名無しさん
垢版 |
2017/12/16(土) 23:59:37.87ID:2deUmEBo
--dump=parsetreeオプションか、--dump=insnsオプションで使わないの?
0327デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:23:33.21ID:ZaumiUQl
使いづらいって言われてもそれは主観でしかないよな?
しかも実質、リファクタリング関連のgemを製作する側がどうのこうのであって、
gem利用者には関係なくない?

そもそも他言語での自己書き換えの扱いはもっとやっかいだぞ?
0328326
垢版 |
2017/12/17(日) 00:23:43.41ID:cjnEvY5x
一応補足しとくけど、ruby処理系にそういう機能があるかどうかじゃなくて
dump=parsetreeで出力されたASTから元のソースを復元するツールを作ってみてくれ、という意味だぞ
ちなみにripperでも同じだ
もちろん細かいスペースの差異とかは無視するとしても、不可能なのがわかるよ
リファクタリングや静的解析に使うなら処理系付属のは使い物にならないので専用のASTが絶対に必要だ
0329デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:29:01.32ID:ZaumiUQl
構文木と並行して字句解析つかえば何も問題ないぞ
というか、そういうgemがごろごろあるぞ?

また知ったかしちゃったのかな?
0330デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:34:09.11ID:cjnEvY5x
>>329
意味不明だなあ
字句解析の結果をどうやってASTに紐付けるの?
結局独自に構文解析するんなら、それはつまり「専用のASTが必要」ということになるわけだけど、
自分で言ってること理解してる?
0331デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:40:42.77ID:X5PuZ6e5
荒らしはrubyでリファクタリング出来る事が物凄く不満らしいけど、親でも殺されたのか?
これでも読んで落ち着け
つリファクタリング:Rubyエディション、2010
0332デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:51:54.13ID:ZaumiUQl
>>330
だからgemがごろごろあるだろ
現実に存在するgemを否定しても現実は変わらんぞ?

そもそも妄想を騙るならruby-devかruby-listで発言しろ
ここはおまえの妄想ノートじゃねよボケ
0333デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:52:55.58ID:Hi83U6qj
リファクタリングはどの言語でもできる
ただやりにくい言語とそうでない言語が有る
Rubyはやりにくい。時間がかかる
0334デフォルトの名無しさん
垢版 |
2017/12/17(日) 00:55:41.57ID:X5PuZ6e5
>>333
自演ばれてんぞ
0337デフォルトの名無しさん
垢版 |
2017/12/17(日) 01:05:40.92ID:vwVDXOLh
俺には>>336もプロレスの自演に見えるけどね
批判的意見に毎回バカっぽく突っかかって論破されてる噛ませ役
0338デフォルトの名無しさん
垢版 |
2017/12/17(日) 01:06:56.15ID:X5PuZ6e5
>>337
も自演か
0339sage
垢版 |
2017/12/17(日) 01:22:18.66ID:bfi3jyev
リファクタリングって頭空っぽにして代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
なんで時間がかかるとか難しいとか話しが出てるんだ?
0340デフォルトの名無しさん
垢版 |
2017/12/17(日) 01:48:45.01ID:ZaumiUQl
リファクタリングが何か知らない奴が混じってて必死でrubyのネガキャンしてるだけ
ruby-devやruby-listだとすぐ嘘がばれるから

もうこの荒らしは排除いいよ
0341デフォルトの名無しさん
垢版 |
2017/12/17(日) 02:32:17.52ID:Hi83U6qj
>>339
> 代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
> リファクタリングって頭空っぽにして代数的に適用すれば安全にコードを変えられるテクニックの事だろ?
> なんで時間がかかるとか難しいとか話しが出てるんだ?

代数的に適用するためには、十分な情報が必要だからだよ。

例えば2つの数値の掛け算の答があったとする
その答から、なんとなんの数値の掛け算かを求めるのは大変
答が複数あることもあるからだ
だけどそのうちひとつの数値がわかっていれば、答はすぐに分かる


型にも同じ話が言える。静的型付け言語の場合は、変数に型が定義されているから
そこから代数的に安全にコードを変えられるテクニックが使える

だけど型がわからなければ、そこから代数的に安全にコードを変えられるテクニックが使えない。
だから時間がかかる。一部の人はそのことを”できない"と表現しているがj。
それは違う。いくつもの可能性を検討して、これだ!と安心できるまで時間がかかるのだ。
0342デフォルトの名無しさん
垢版 |
2017/12/17(日) 02:47:32.03ID:BeMxy3i4
また自演の長文か

そんなに主張したい事があるなら初心者スレじゃなくruby-devかruby-listで言え
わざわざ初心者スレで嘘をばらまく必要は無いだろう
0343デフォルトの名無しさん
垢版 |
2017/12/17(日) 03:00:08.85ID:X5PuZ6e5
リファクタリングにちなんで、
みんなはコードに自己書き換えの処理させる時って何を使ってる?
0344デフォルトの名無しさん
垢版 |
2017/12/17(日) 03:28:07.16ID:BeMxy3i4
初心者スレでイキってる荒らしはこういう質問が来ると急に大人しくなるんだよな

俺は普通にdefine_methodを使うぐらいしかしていない
0346デフォルトの名無しさん
垢版 |
2017/12/17(日) 03:47:09.35ID:X5PuZ6e5
質問に答えられないのはわかった
0348デフォルトの名無しさん
垢版 |
2017/12/17(日) 03:54:31.53ID:X5PuZ6e5
>>347
お前に言ってるんだが
0349デフォルトの名無しさん
垢版 |
2017/12/17(日) 03:58:35.63ID:Hi83U6qj
え? その前に俺の>>342のレスに答えてよ
おとなしくなるって、俺のレスに答えられなくなるって
話だと思ったよ
0350デフォルトの名無しさん
垢版 |
2017/12/17(日) 04:02:09.36ID:vi6El7FV
ソースを直で修正し再ロードして実行までをrubyコード内で記述できるわけだから、
言ってしまえばなんだって出来る

gemでparse2rubyとか色々あるし
0351デフォルトの名無しさん
垢版 |
2017/12/17(日) 04:18:39.08ID:X5PuZ6e5
>>349
ID:Hi83U6qj「俺はID:BeMxy3i4だ」と言われても、
スレを妨害してるのはお前しかいないんだが
0352デフォルトの名無しさん
垢版 |
2017/12/17(日) 04:48:50.54ID:PRNmBS9S
>>349
いつまで逃げ回る気だ荒らし
本人確認するかruby-devかruby-listで早く発言しろ

>>351
Ripper.sexp_rawで良い具合にメソッドを書き換えて使ってる
0353デフォルトの名無しさん
垢版 |
2017/12/17(日) 08:13:32.84ID:6NwF6CYy
「ruby-devかruby-listで発言しろ」って言いまくってる奴は単発IDでの自演常習犯だから絡まないでスルーしましょう
>>252でも説明したけど自治の振りをした粘着荒らしです
0354デフォルトの名無しさん
垢版 |
2017/12/17(日) 09:16:34.42ID:X5PuZ6e5
自演を繰り返す荒らしがスレ住民全員を荒らし認定か
ruby-devかruby-listで発言するのがそれほど怖いのかな?
0356デフォルトの名無しさん
垢版 |
2017/12/17(日) 11:54:17.21ID:Hi83U6qj
>>351
それ間違えたw 本当は>>341と書くつもりだった

透明あぼ〜んされてて見えなかったから
ずれてしまったのかな?
0357デフォルトの名無しさん
垢版 |
2017/12/17(日) 12:02:37.42ID:X5PuZ6e5
スレッドの進行を妨害して荒らすな
0358デフォルトの名無しさん
垢版 |
2017/12/17(日) 13:07:26.56ID:7FFT55NR
ちょいと質問です。
Cだと"__"から始まったり、"_"+大文字となったりする識別子は予約扱いだと明文化されてるけど、Rubyはどうなのかちょっと気になってます。
組み込みで__FILE__ __LINE__ __method__とかが定義されているのは知ってます。

gemライブラリの中で2つのアンダースコート"__"から始まり、同じく"__"で終わるメソッド名を定義しようかと考えてるけど、問題ないかなと思って。
0359デフォルトの名無しさん
垢版 |
2017/12/17(日) 13:28:17.09ID:Hi83U6qj
@で始まる変数はインスタンス変数
@@で始まればクラス変数
$で始まれば組み込み変数
大文字で始まれば定数
selfもnilもtrueもfalseも変数
0360デフォルトの名無しさん
垢版 |
2017/12/17(日) 13:31:03.53ID:X5PuZ6e5
リファレンスで擬似変数の所を見てかぶりそうなのをさければ問題ない
かぶっても見分けられるなら問題ない
0361デフォルトの名無しさん
垢版 |
2017/12/17(日) 13:36:18.37ID:CQTxJs7f
Ripper.sexpつかえばソースの自己書き換えできるだろ

誰だよ出来合ないって言ったのは
0363デフォルトの名無しさん
垢版 |
2017/12/17(日) 14:16:42.77ID:CQTxJs7f
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]]]]
これでリファクタリングが難しいとか時間がかかるとか言ってた奴もいたな
0366デフォルトの名無しさん
垢版 |
2017/12/17(日) 14:42:49.46ID:Hi83U6qj
>>365
何を言ってるの?

リファクタリングっていうのは人が
どうすべきかを考えるんだよ

今何が問題で、どうすべきかを考えるためには
ソースコードを読んで理解しなければならない。

その理解するまでの時間の話なんだけど

で、そのコードをどうしたいのか俺には分からん
まずそこからだよね。君が説明するべきことは
0367デフォルトの名無しさん
垢版 |
2017/12/17(日) 15:09:58.55ID:CQTxJs7f
メソッド抽出、インライン化、メソッドシグニチャの変更と、
IDEにある主なリファクタリング機能なんだが
これをrubyには出来ないと言ってた奴が居るらしい
0369デフォルトの名無しさん
垢版 |
2017/12/17(日) 15:45:11.24ID:X5PuZ6e5
Kernelモジュールに__で始まるメソッドがあるからそれにも気をつけろ
わからないことがあったら一度自分でリファレンスを検索して細部までしっかり見ろ
0370デフォルトの名無しさん
垢版 |
2017/12/17(日) 15:51:07.46ID:F+iLZcQ1
>>367
メソッド抽出はできるけどインライン化やシグニチャの変更は安全には行えないよ
実際にどのメソッドが呼ばれるかは実行してみるまで分かんないし、メタプログラミングでメソッドが存在しない場合すら珍しくない
0371デフォルトの名無しさん
垢版 |
2017/12/17(日) 16:13:40.93ID:X5PuZ6e5
シグニチャの変更は、Ripper.sexpからの配列をまわして旧シグニチャを指定のに書き換えてソースに戻せば良いように見える
そもそもrubymineで出来る
インライン化なんて普通に:assign部分を使われてるところで展開すればいいだけだからシグニチャの変更より楽そう
逆に変数の切り出しも出来るだろこれ

ちょっとコードを書いてみるか
0372デフォルトの名無しさん
垢版 |
2017/12/17(日) 16:34:07.16ID:DhuU3UWX
ElectronみたいにWebベースでGUIを作ってRubyで動的処理を行うフレームワークとかないんかな
ActiveScriptRubyは近いけどWin/IE限定の上にRScriptをインストールする必要があるのがイマイチ
インストール不要で軽量・軽快なのが欲しい
0374デフォルトの名無しさん
垢版 |
2017/12/17(日) 19:08:51.91ID:Hi83U6qj
結局Rubyでは候補を出すところまでしかできないんだよね
代数的に適用することができない

その変更が正しいかどうかをコード全体を読んで
考えないといけないから、時間がかかってしまう
0375デフォルトの名無しさん
垢版 |
2017/12/17(日) 19:09:35.99ID:Hi83U6qj
>>367
> メソッド抽出、インライン化、メソッドシグニチャの変更と、
> IDEにある主なリファクタリング機能なんだが

少ないね
0376デフォルトの名無しさん
垢版 |
2017/12/17(日) 22:52:07.76ID:X5PuZ6e5
荒らすな
0382デフォルトの名無しさん
垢版 |
2017/12/18(月) 08:25:44.94ID:9Kb0ajxH
2ch学習法(今なら5chか)って言われてたやつが通じると思ってるんだろうけどな。
0383デフォルトの名無しさん
垢版 |
2017/12/18(月) 12:55:26.65ID:L2o9nXM3
初心者スレはスレ消費激しいけどアンチスレはぜんぜん流行ってないな
アンチ死んでる?
0385デフォルトの名無しさん
垢版 |
2017/12/18(月) 15:10:45.19ID:aXpCltYZ
アンチは寂しくて初心者スレに来ちゃうわけか
0386デフォルトの名無しさん
垢版 |
2017/12/18(月) 15:26:16.95ID:XEro/kye
>>371を参考にしたらリファクタリング機能を組めた
ソース読み込んでS式書き換えてソースに書き戻すって処理だけど俺でも簡単に出来るんだな
0388デフォルトの名無しさん
垢版 |
2017/12/18(月) 16:10:14.00ID:zBhLgaSa
こっちでは問題にすらなってない
俺ですら出来るレベルだけど、それでも無理ならVMにバイトコード見せてもらったら?
0389デフォルトの名無しさん
垢版 |
2017/12/18(月) 16:25:37.10ID:4mfkLjZ7
>>387
そんな事も分からないお前が無能なだけ
もう来なくていいぞ
0390デフォルトの名無しさん
垢版 |
2017/12/18(月) 16:30:56.90ID:zBhLgaSa
[:var_ref, [:@kw, "self", [2, 0]]]みたいなノードがありそれを上にたどって行くとselfが何か判る
S式は慣れれば読めるし、処理も楽
0391デフォルトの名無しさん
垢版 |
2017/12/18(月) 17:48:23.09ID:e/V/7Ip9
入れ替えることができちゃうから実際には単純にはいかないってことを言いたかっただけ
0393デフォルトの名無しさん
垢版 |
2017/12/18(月) 21:26:15.43ID:SUjpjhtq
いや、
リファクタリング前のソースコード からS式を作って

そのS式から「リファクタリングされたソースコードを生成して見せる」って
言うのならどうぞwどうぞw って話だけど

可能不可能の話なら可能。だけど大変すぎなのでやらない
それを「リファクタリングできない」っていう表現で>>392は書いた
0395デフォルトの名無しさん
垢版 |
2017/12/18(月) 21:33:39.72ID:SUjpjhtq
>>394
俺もS式から(可読性が高い)リファクタリングされた
ソースコードを作り出すのは不可能だと思ってるよw
だからダンプするまでもない

何が言いたいのかって言うと、リファクタリングの話題で
S式、S式、って何が言いたいんだこいつ?ってこと
S式はリファクタリングと何の関係もありません
0396デフォルトの名無しさん
垢版 |
2017/12/18(月) 21:35:19.46ID:SUjpjhtq
S式から可読性が悪い変なソースコードに変換することはできるだろうが
そりゃリファクタリングと真逆な行為だしな
0397デフォルトの名無しさん
垢版 |
2017/12/18(月) 21:53:35.09ID:ZBmMrMTz
そうそう
ripperのASTはコード生成には不向きであると言ってるだけで、別にRubyを否定しているわけじゃないのに何を必死に喚いてるんだろうね
コード生成に関しては、単に「文法上の同値の解釈」を一切入れない、より低レベルなパーサを作って正確なASTを得らればいいだけのことだ
動的型だって静的型にはない良さが沢山あるのに、アンチ連呼君はそこを無視して「静的型にできることは全てRubyにもできる」という無茶な主張を続けている
そうやって本質を理解しないまま無理筋で反論するから馬鹿にされるんだといいかげん気付け
0398デフォルトの名無しさん
垢版 |
2017/12/18(月) 23:16:47.78ID:LVUvAKSO
初心者だからRubyとPythonの違いがわからんのだけど、どう違うんだ?
Rubyがもっと流行ってもいいと思うんだけど
0399デフォルトの名無しさん
垢版 |
2017/12/18(月) 23:28:55.91ID:tRPcthrg
おいアンチ、
初心者騙してないでいい加減アンチスレに帰れよ
おまえがリファクタリングできないのは判ったから
0400デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:03:52.94ID:iE/A7V+0
自分でうまくソースコードに書き戻す処理が書けないのをRubyの所為にしてはダメだろう

どうしてもやりたい場合はRipper2rubyってgemを使え
0401デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:16:12.52ID:si5W7uAD
可能不可能の話に持っていくから(わざとやってる?)
話がややこしくなるんだよ

構文解析は、静的でも動的でもできる。
その時、どれだけの情報を得られるかっていうのは
型情報を書いてある静的のほうが多いのは明白
(動的のメリットは書かなくて良いことなんだから、動的の方が多くなることはない)

静的のほうがより多くの情報を得られる。
それがリファクタリングをする上での情報の多さにつながり、
リファクタリングを自動化する上での情報にもつながる。

静的のほうが予め書いておく情報が多い分、静的解析でわかることが多い。
動的だとわからない情報は、人がコードを見て推測するしかない
人の作業は遅い、リファクタリングの速度につながってくる

リファクタリングが可能か不可能かの話じゃない
作業する時の速度の話
0405デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:32:24.61ID:si5W7uAD
俺が言っても信用しないのだろうから、

http://washiiku.hatenablog.com/entry/2014/12/19/054914

> 上に書いたように変数の型をエディタが察してくれるので、
> 対応するメソッドなどにジャンプしたり、逆に使用されている
> 箇所も一覧で表示できます(ただし静的言語ほど正確ではない)

> JetBrains系ではお馴染みですがリファクタリングが便利です。
> スコープ内の変数名の変更が定番ですが、クラス名などグローバルな
> 名前は型情報からプロジェクト全体のリファクタリングをしてくれます。
> (上述したとおり静的言語ほど正確ではないので、大規模な変更は実用的ではない)


この正確でないというのが問題で、結局人が判断する部分が多くなる。
大規模な変更は実用的ではないのは何故かと言うと
大規模=変更箇所が多い=人が判断する場所が多いので
正しいこと判断するのが大変
0408デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:41:45.22ID:cabpZd/N
出来る出来ないの話じゃないって自分で言い出してからまだ30分も経ってないのに、
出来る出来ないの話に戻したな
これでは誰もアンチを信じてくれないわ
0409デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:46:31.62ID:si5W7uAD
動的言語がなぜリファクタリングに弱いかというと
いつクラスの定義が定まるかを考えてみればわかる

まずリファクタリングというのはソースコードを修正する
そしてクラスの定義はソースコードから生成される

この時、ソースコードからクラスの定義が単純に決まれば良いのだが
動的言語では、実行するまでクラスの定義が決まらない

ならば実行すればいいと思うかもしれないが、何をどう実行すれば
クラスの定義が定まるのかを知る方法がない

つまりクラスをリファクタリングする場合、
クラスの完成形を知ることができないので、
人間が判断するしかなくなってしまい時間がかかる
0410デフォルトの名無しさん
垢版 |
2017/12/19(火) 00:47:31.81ID:OxL2RNB7
>>409
長文はいいから自分のスレへ帰れ
ここはおまえの日記帳じゃない
■ このスレッドは過去ログ倉庫に格納されています