Ruby 初心者スレッド Part 61 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/08/25(金) 15:59:11.22ID:HsL9LVKJ
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 60
https://mevius.2ch.net/test/read.cgi/tech/1493398918/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
2017/09/11(月) 22:53:57.56ID:/+/7clo/
ブロックがオブジェクトじゃないのはほんと糞
Rubyは基本的に嫌いじゃないけどこれだけは擁護できないわ
2017/09/11(月) 23:30:33.81ID:503iQjsy
いや、ふつう。
必要であればlambdaにすればよし。
2017/09/11(月) 23:51:41.69ID:dZxzu+uY
>>210
f = method :add
p f[1,2] # => 3
214163
垢版 |
2017/09/12(火) 00:16:04.48ID:EWvqPynr
>>203
「マルチパラダイム」への反証じゃなくて
「どんな書き方でも可能」への反証
「他の言語で可能だけどRubyじゃできない書き方」の例証でもある
2017/09/12(火) 00:26:02.80ID:FDETfUWp
メソッド呼び出し時の括弧をオプショナルにしてるから
f = add みたいなのは出来ないよね
でもそういう使い方をするときはメソッドじゃなくProcオブジェクト使う
だからObject#methodを実際のコードで使ったことはない
2017/09/12(火) 00:37:53.72ID:JOxdLua/
俺が質問したのは書き方
Rubyは純オブジェクト指向で書けるし、関数言語的な書き方も可能、ワンライナーやダックタイピング、メタプログラミングも書ける
だから逆に他の言語で実用的な書き方を挙げてほしかったんだけど
217デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:09:50.45ID:HQWpPXKt
n++
218デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:10:31.53ID:HQWpPXKt
rubyの連中は、初心者、日本人をバカにするからきらいだ
219デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:11:34.30ID:HQWpPXKt
マルチパラダイムの言語をしらべればいいだろ
D, pike, いろいろある
2017/09/12(火) 01:12:37.06ID:K8M+GTE7
>>215
何でそんな言い訳がましい書き方すんの?
defで宣言した関数は変数に代入出来ない。そのような場合はProcを使う必要がある。この行き当たりばったりな仕様は関数を第一級オブジェクトとして扱える言語が流行ってきたため「る、rubyでもできるし!」と言いたいがために適当に実装したためである、ってスパっと言えよ。
2017/09/12(火) 01:15:08.18ID:EWvqPynr
>>216
それは「書き方」の定義が曖昧だから

でもまあもう少し小さな区分で言うと
動的型付けの関係でJavaができるような
メソッドのオーバーロードは標準のRubyではできない
2017/09/12(火) 01:19:06.28ID:TH/zNQOA
思い込みで嘘振りまいてたアンチが発狂しとる
2017/09/12(火) 02:14:24.98ID:FDETfUWp
>>220
嘘で印象操作はいかんよ
そのうちRubyも韓国起源説を唱えそうだな
2017/09/12(火) 03:23:16.78ID:65BZCqIl
http://fatiherikli.github.io/fil/
のローカル版のような2画面エディタないですか
2017/09/12(火) 06:32:54.30ID:Yg2YMH7r
>>224
今プログラミングエディタで一番勢いがあるのはVSCode
見た目はだいたいこんな感じ
2017/09/12(火) 07:48:04.25ID:xdcKpwUc
Emacsじゃあかんの
227デフォルトの名無しさん
垢版 |
2017/09/12(火) 10:04:19.58ID:9jgbEmKh
>>218
Rubyの連中ってのは、「たのしい」だとか、「直感的」とか、「生産性が高い」
とかってよく言う。

けど、メタプログラミング、DSLの辺りで躓く人って多そう。
SinatraのDSLがどう言う実装になっているのか理解するのに相当時間かかった。

特に、こんなコードがキモだとは、長らく気づかんかった。
class A
puts “OK”
end
2017/09/12(火) 11:06:52.61ID:WW0MtbKa
JavaScript でも、関数内の地の文は、実行される

たぶん、Python, Groovy なども同じだろ
229デフォルトの名無しさん
垢版 |
2017/09/12(火) 11:11:57.63ID:9jgbEmKh
>>228
THX
JavaScriptでも同じなのね。class定義内の地の文が実行されるの。
2017/09/12(火) 11:25:19.54ID:h0iAeYHr
> けど、メタプログラミング、DSLの辺りで躓く人って多そう。

その前に自分みたいにオブジェクト指向とか言う暗号が理解できなくてC言語で止まってしまう人もいると思います。
アセンブラからC言語は問題なかったんですけどね…
2017/09/12(火) 11:57:03.55ID:onUD/nnU
>>230
オブジェクトのポインタも暗黙の引数として渡される、と割り切ってしまえばとにかく理解はできるはず。
オブジェクト指向だからのこともあるけど、全体像がわかれば、たいして難しいことではないと思う。
2017/09/12(火) 12:04:12.58ID:WW0MtbKa
まずこの本で、オブジェクト指向を学ぶ
スッキリわかる Java入門 第2版、2014

その後、この2冊を順に読む
たのしいRuby 第5版、2016
みんなのPython 第4版、2017

だから、勉強する順番が、この順になる

この後に、4つの道に分かれる。
1. Groovy, Kotlin
2. C#
3. C++
4. JavaScript
233デフォルトの名無しさん
垢版 |
2017/09/12(火) 18:53:46.13ID:JOxdLua/
リファクタリング:Rubyエディションを読んだ方がもっと直接的にオブジェクト指向を学べる
リファクタリングと名が付いてるけどオブジェクト指向が何のためにあるのか、源流から把握できるよ
234210
垢版 |
2017/09/12(火) 23:44:30.69ID:hhSY9FWw
>>220
>defで宣言した関数は変数に代入出来ない

defで宣言できるのはメソッドであって関数ではない
またRubyには(関数型言語における)関数は存在しない
基本に立ち返って、計算モデルという視点でメソッドと関数との違いを
学習したほうがいいと思われる

また関数型言語の流行を見て適当な実装したのはナイスジョーク言語(>>209)だよ
・クロージャって何がいいの?
 http://mevius.2ch.net/test/read.cgi/tech/1415419907/197
このカキコをまとめると、君の文章スタイルを真似れば:
  lambda式の本体には式しか書けない。文を書きたい場合はdefで名前付きの関数を
  宣言する必要がある。この行き当たりばったりな仕様は関数型プログラミングを
  扱える言語が流行ってきたため「ば、pythonでもできるし!」と言いたいがために
  適当に実装したためである、
ってスパっと言えるね

少なくとも、Rubyはその誕生の時からすでにオブジェクト指向と関数型を融合した
マルチパラダイム言語として設計された
・推薦図書/必読書のためのスレッド 74
 http://peace.2ch.net/test/read.cgi/tech/1409526637/857
手続き型言語として誕生し後から流行を追ってオブジェクト指向と関数型を
行き当たりばったりで適当に実装したナイスジョーク言語とRubyを一緒にしないでね!!(棒
2017/09/13(水) 00:11:46.24ID:ZSgQvDIS
>>234
>defで宣言できるのはメソッドであって関数ではない
この難癖は頭おかしい。
トップレベルで定義したメソッドを関数と呼ぶのは便利な方便じゃないか。
そんなこと言ったらいちいち演算子もメソッドと言わなければならないのか?
たしかまつもと著の初期の書籍でも
関数を定義してみましょう→実はRubyでは関数はメソッドとして〜という流れだったはず。たしか。たぶん。
2017/09/13(水) 00:40:14.46ID:S8v0D06m
そしたらブロックローカル変数という
糞ダサいものは何故必要になったのですか?
やっぱり変数宣言は必要だったのですか?
2017/09/13(水) 00:43:26.25ID:n1InxPaY
>>235
少しRubyやったことある人なら「defで宣言した関数」なんて理解の仕方をしないからさ
>>234の言い回しはともかく>>220はRubyのメソッドを理解してないって指摘でしょ

演算子はメソッドの一部をさす言葉なんだから演算子って呼んでもおかしくないよ
でもRubyの場合メソッドは関数じゃないから「defで宣言した関数」とは言わない
2017/09/13(水) 04:43:32.45ID:OIAQviv2
>>236
うん、変数宣言は必要だった。
まちがいない。
239デフォルトの名無しさん
垢版 |
2017/09/13(水) 06:57:22.00ID:QnpmdH9u
鏡の自分と話していないでいい加減リアルで話し相手を見つけろ
いつまでごっご遊びする気だ?
240デフォルトの名無しさん
垢版 |
2017/09/14(木) 05:43:14.25ID:MKn91q5M
>>232
スッキリわかる Java入門 第2版
658ページ

すごいなぁ。

俺が良かったのは、Java流オブジェクト志向入門、この薄い本でOOPに合点が言った。
それから、Master Mind of Programming.

OOPのキモは、差分プログラミング。
2017/09/14(木) 05:49:47.26ID:CERdfB5z
オブジェクト指向の初期に言われてた
(継承による)差分プログラミングは
今はOOの主流でない
2017/09/14(木) 06:39:33.22ID:DHSnOET6
主流ではないどころか現代では継承による差分プログラミングはクラスの典型的な間違った使い方であるというのが一般的な認識だよね
あまりにも時代錯誤が過ぎる
243デフォルトの名無しさん
垢版 |
2017/09/14(木) 09:15:38.86ID:RGoLM/1P
class Product < ApplicationRecord
end

この継承だけで、
p = Product.new
p.name = “Some Book”
と書き始める事ができるが!

これは、差分プログラミングでは無いのか?
2017/09/14(木) 11:25:35.14ID:mzgiopKB
構ってほしいなら他スレいけ
2017/09/14(木) 13:23:53.04ID:hmZWacm7
今のオブジェクト指向って差分は嫌われてんのか。
しらんかった。
2017/09/14(木) 13:45:04.43ID:emC4w7HW
差分プログラミングは継承元のクラスの細かな仕様
特に処理の流れのようなものまでしっかり把握してないと
破綻するからな
複雑な動きをするクラスの一部だけ上書きして破綻なく動かすのは難しい
2017/09/14(木) 13:58:16.02ID:hmZWacm7
オブジェクト指向って継承とか差分とかをなくしたら
それって関数型プログラミングじゃないのか?
2017/09/14(木) 14:04:35.89ID:QnR6ews3
差分と増分は違う。
一般的に差分プログラミングというと、243の例のように元あるものに足するだけではなく
上書きして元あったものを「引く」ことを伴うやり方を指す。
これは大抵の場合、論理的なis-A関係を無視した実装継承になる。
2017/09/14(木) 14:32:09.28ID:8Cslzo3n
何がどうダメでどうするのがより良いことなのか書いてくれ
250デフォルトの名無しさん
垢版 |
2017/09/14(木) 14:44:12.14ID:RGoLM/1P
>>242
何が、「だよね」だよ。
変なやつ。
たんなる、知ったかだわぁ、こいつ。
251デフォルトの名無しさん
垢版 |
2017/09/14(木) 18:45:33.64ID:MKohVal2
>>246
そうでもない
2017/09/14(木) 19:46:31.21ID:QnR6ews3
>>249
簡単な話だよ
クラスを継承するとき、スーパークラスの実装を潰してはいけない
常に増分の形になるようにする
たとえばクラスAのメソッドaの動作を変更したいとき、サブクラスBでaをオーバーライドして置換えてしまうのが継承による差分プログラミング
そういう場合、AとBを共通のスーパークラスCを継承するようにして、Cのaは空にしておき、A, Bそれぞれでaを実装するのが一つの正解
2017/09/14(木) 20:29:04.75ID:emC4w7HW
多分意味が無いと思う
物分かりが良い人だったら今時Rubyなど触ってるわけないし
そのなかでも特別アレな人がここに集まっているわけだし
こういう人に何言ったって、なぁ・・・
そりゃ、聞く気があって向上心があるならRubyなんか触ってないって

差分プログラミングがあまり良くないって話は随分昔からあって
他スレッドだと、それを言っても、何今更当言ってるんだ?
となるだけなんだが、こんなことに食って掛かるやつがいるってのがね
さすがのRubyなんだわ

冗談みたいな話だけど、マジで
Rubyは今の流行りと全く反対の方向に全速力な言語だから
こういう言語を好む人に常識を解いても無駄なんだわ
2017/09/14(木) 20:33:41.31ID:TqGAiQtg
はいはいNGNG
2017/09/14(木) 20:36:29.79ID:DHSnOET6
まあ既存のクラスのメソッドを置き換えたりする醜悪なモンキーパッチをクールだと有難がってる連中が沢山いるくらいだから、
継承を使った差分プログラミングなんて可愛いもんだ
2017/09/14(木) 20:50:14.91ID:i72uwPMW
>>253
> そりゃ、聞く気があって向上心があるならRubyなんか触ってないって
つまりお前は聞く気がなくて向上心がない、という自己紹介?
2017/09/14(木) 20:56:24.98ID:DHSnOET6
念のためイメージしやすいように具体例を出しておこう。
何らかの処理結果をHTTPで出力するHTTPPublisherクラスがあったとしよう。
これをHTTPではなくFTPで出力したくなったが、最終的に送信するところ以外は実装は全て同一だ。
そこで、HTTPPublisherクラスを継承して最終的な送信のところだけをオーバーライドしたFTPPublisherクラスを作った。
その結果、FTPPublisher is HTTPPublisherという継承関係になった。
これが継承による差分プログラミングだ。何がおかしいか考えてみよう。
2017/09/14(木) 20:57:42.86ID:i72uwPMW
つまり、ダックタイピング最高、ということか
2017/09/14(木) 21:08:29.85ID:emC4w7HW
>>256
俺はRuby触ってないし
失敗した発明に興味があるだけ
2017/09/14(木) 22:12:26.20ID:i72uwPMW
>>259
> 失敗した発明に興味があるだけ
嘘はいけない
お前は単に叩いてスッキリしたいだけだよ
そのためには捏造も辞さない、半島系メンタリズムなんだよ
恨の文化ってやつだ
そこを自覚しよう
261デフォルトの名無しさん
垢版 |
2017/09/14(木) 22:17:27.79ID:mzgiopKB
荒らしはまーた嘘ついちゃったのか
262デフォルトの名無しさん
垢版 |
2017/09/14(木) 23:07:38.38ID:z8360qWk
ガチ初心者で申し訳ないっす。
rake db:migrate:reset
rake db:seed
railsで作るサイトに上を実行してくれるボタンを作ることって出来ますか?
263デフォルトの名無しさん
垢版 |
2017/09/15(金) 00:06:02.35ID:pcdb6BZK
>>259
あらま!
見る目が無いのね
2017/09/15(金) 01:13:28.42ID:HyLcEmwG
>>262
よくわからんけど、Ruby内からバッククォート文で実行させれば良いんじゃない?
265デフォルトの名無しさん
垢版 |
2017/09/15(金) 02:50:07.52ID:NqjvejJe
>>264
ありがとうございました!感謝感激雨あられっす
2017/09/15(金) 05:52:12.67ID:gy747Xnp
差分問題は継承より委譲、で終わり
2017/09/15(金) 13:17:19.48ID:M6zHVajf
>そりゃ、聞く気があって向上心があるならRubyなんか触ってないって

今年一番説得力あるレスだった
2017/09/15(金) 21:25:27.63ID:gy747Xnp
まあRubyは使いやすくて楽だからな
Lispみたいな言語だと
向上心や忍耐力が必要とされる
269デフォルトの名無しさん
垢版 |
2017/09/16(土) 00:44:23.41ID:54wKV8j0
手軽だし、便利だし、どこにでも手が届くわりに、細部まで言語として背景や地盤が整備されてる
確かに、使える人が増える事はあっても減る事は無い言語だ
270デフォルトの名無しさん
垢版 |
2017/09/16(土) 03:15:44.04ID:cRp93fnk
>>269
俺、その背景や地盤ってのを理解するのに、めっちゃ時間かかった。
2017/09/16(土) 07:19:19.83ID:ja70x9oy
Gradle は、Groovy だけど、
vagrant, chef, SASS とか、ツールを作る時は、真っ先に、Ruby が選ばれる。
他の言語は、Rubyよりも、2年ぐらい遅れる

この2つは、DSL も作りやすい。
さらに、Groovyには、JavaVM が必要だけど、Rubyには必要ない

おまけに、シェルスクリプトの代わりにもなるし、
PowerShell よりも、プログラミングしやすい
2017/09/16(土) 07:28:00.02ID:AcW1bn43
>>271
>ツールを作る時は、真っ先に、Ruby が選ばれる
おっそうだな
静的サイトジェネレータならJekillとか

Rubyはプロトタイプを早く作るのに向いてるから
新ジャンルを開拓するのにふさわしい
2017/09/16(土) 09:14:50.48ID:dauRpkAs
そう感じるのは君がRuby村の中から見える世界しか見てないからだ
少なくとも今はRubyが最先端とはとてもじゃないが言えないよ
274デフォルトの名無しさん
垢版 |
2017/09/16(土) 11:26:43.15ID:54wKV8j0
アンチって平然と人を騙そうとするよな
2017/09/16(土) 11:33:09.75ID:DEccgWHW
>>271
その手のツールがRuby製なのはちょっと不思議なんだよな。
バージョンアップで壊されるかもしれないんだから。
もっと安定性のあるものを選べばいいのに。
276デフォルトの名無しさん
垢版 |
2017/09/16(土) 11:45:25.97ID:gf/ZkNkm
Railsと違ってRuby自体の後方互換性はかなり高いよ。1.8や1.9で作ったコードも今もそのまま問題なく使えてる。使えなくなる機能があっても数バージョン前から警告出るから対応しやすい。
277デフォルトの名無しさん
垢版 |
2017/09/16(土) 11:50:32.56ID:54wKV8j0
rbenvで全ver入れてOK
278デフォルトの名無しさん
垢版 |
2017/09/16(土) 15:03:52.29ID:cRp93fnk
>>273
Rubyは最先端ではない。
首相は獣医学科設置に関与してない。
首相は、国有地を森友学園へ売却するよう指示してない。

これらは、証明できない。

ツールを作る時の選択肢にRubyがある。
これらの証明は例を示せば良い。

例:vagrant, chef, SASS
2017/09/16(土) 16:48:46.12ID:ZCzFTInQ
>>270
おまえにrubyは早すぎる
2017/09/16(土) 17:39:16.46ID:ja70x9oy
自分がツールを作る時に、シェルスクリプトは論外だろ。
PowerShell は、補完が効くけど、
クラスを使うような、本格的なプログラミングは出来ない

Kotlin は大掛かりで、厳格なものを作れるけど、
静的チェックが厳しすぎるような気もする

結局、Groovy, Ruby が手軽。
DSL も作りやすい

Haxe も、様々な言語に変換できるから、面白そうだけど
2017/09/16(土) 17:58:02.30ID:3y963gmF
PowerShellはクラス作れるぞ?
そんなんだからアンチに馬鹿にされるんだよ
2017/09/16(土) 18:03:45.86ID:3y963gmF
あと静的チェックが厳しすぎるというのも意味不明だな
Rubyだって想定してる型を間違えたら落ちるかバグるだろう
型書くのが面倒というならわかるけど、静的チェックが緩いこと自体にメリットはない
2017/09/16(土) 18:08:25.83ID:iZTbrLgf
静的チェックをするということは、Crystal みたいな方向性になるのかな
2017/09/16(土) 20:35:26.41ID:AcW1bn43
>>280
要はLLとかグルー言語っていうか
シェルスクリプトと静的言語の中間が
Ruby(やPython)の守備範囲ね
2017/09/16(土) 20:37:44.80ID:AcW1bn43
>>281
PSはバージョンアップでクラス構文が追加されたね
でもまあ本格的なオブジェクト指向はRubyの方がやりやすい

>>282
動的型付けにも多態するのに継承いらないとか
ダックタイピングとかメリットがある
286デフォルトの名無しさん
垢版 |
2017/09/16(土) 20:38:28.09ID:PUFjteak
>>282
>静的チェックが緩いこと自体にメリットはない

たとえばC言語が標準ライブラリ関数である printf を
容易に実装できたのは、C言語の「静的チェックが緩い」という
特性がメリットになった実例だろ
287デフォルトの名無しさん
垢版 |
2017/09/16(土) 20:43:55.95ID:54wKV8j0
アンチはまた自演で誘導しようとしてんのか

ほんと嘘をついて騙すのが好きだな
288デフォルトの名無しさん
垢版 |
2017/09/16(土) 21:02:57.30ID:PUFjteak
>>280
ためしに「Kotlin dsl」でググって見たら最初にヒットした記事
・KotlinでイケてるDSLを作る
 http://qiita.com/kikuchy/items/7c8893c4e7e11dafdb6c

この記事では DSL を作るのに有益な Kotlin の言語機能を
6つ紹介しているけど、先頭の4つは Ruby と共通しているね
・拡張関数
 ―> 既存のクラスへ後からメソッド定義を追加できる
・引数の最後がラムダ式であれば、メソッド呼び出しの …(略)
 ―> Ruby の「ブロック付きメソッド呼び出し」
・ラムダ式のreturnは省略可能
 ―> もちろん Ruby もメソッド/ブロックの最後に書くreturnは省略できる
・thisは省略可能
 ―> Ruby も同じく

特に3つ目の「ブロック付きメソッド呼び出し」は Apple の新世代言語である
Swift でも「Tailing Closure」という名前で導入されている
・クロージャって何がいいの?
 http://mevius.2ch.net/test/read.cgi/tech/1415419907/262

世界は Ruby 良さに気付いている、そして Ruby の良き特性を取り込んだ
新世代言語が次々に登場している(>>283 の Crystal、他には Elixir もある)
2017/09/16(土) 23:13:55.67ID:+qyS/XRX
日々アンチっぽいと感じる書き込みがあるかもしれないが
書き込んでいる本人たちは、そんな気は決してない
これは皆さんに末永くRubyを使ってもらおうと思ってしていること
未だなおRubyが好きな人に、何言っても回心しないのは分かり切ってるから
逆に強化していこうって方向なわけ
2017/09/16(土) 23:18:50.04ID:+qyS/XRX
たとえばシステムにsafeな部分とunsafeな部分があったら
unsafeな部分は一か所にまとめて管理したいって考えるだろう
スラム街みたいなもんだな
別にこの世は俺の管轄するシステムでも何でもないから
どうでも良いっちゃどうでも良いんだが
2chにも隔離スレという文化があるし
似たような感覚ではある
2017/09/17(日) 03:18:56.25ID:tx3RW6Nz
嘘付いてスレを妨害した荒らしのレスが上の方にあるじゃん
292デフォルトの名無しさん
垢版 |
2017/09/17(日) 05:11:26.55ID:7k/HywsS
Rails5.1.4を使用しています
アホしてsendカラムを含んだテーブルをmigrateしたところ、あちこちでエラーが発生するようになりました。
すぐにロールバックし、DBからはカラムが消えたことを確認しましたが、ApplicationRecordを継承したクラスではいまだに生きているようで、症状が改善されません。
ロールバック以外にできることがあれば、教えてください。
2017/09/17(日) 13:22:15.36ID:EJ9y/eYt
>>292
>ApplicationRecordを継承したクラスではいまだに生きているようで

そのModelも戻せよ
2017/09/17(日) 13:27:05.45ID:iyMogwhx
エスパーするが
Rubyではメソッド名が同じであれば同じような振る舞いをします
そのことはRubyで保証されているので
プログラマは振る舞いについて何も考えなくてよいです
メソッド名が同じなら、同じような振る舞いをします
なのでそうしてください
そのあと言語仕様から変数宣言を無くして代入で代用してください
一見すると「変数宣言」と「代入」の区別がつかなくなるように思えるかもしれませんが
変数宣言が無くなるので変数のスコープのことを考えなくてよくなります
これらはRubyでサポートされているので、そのようにしてください
2017/09/17(日) 13:46:03.46ID:rqcmn5Um
荒らしのコピペまじウゼー
296デフォルトの名無しさん
垢版 |
2017/09/17(日) 19:33:50.41ID:vAwE04IK
>>292
Rails の質問や話題はWebProg板のRailsスレへ:
・【RoR】Ruby on Rails Part20
 http://medaka.2ch.net/test/read.cgi/php/1474523013/
297デフォルトの名無しさん
垢版 |
2017/09/17(日) 20:54:55.57ID:vAwE04IK
>>294
> Pythonではメソッド名が同じであれば同じような振る舞いをします
> そのことはPythonで保証されているので
> プログラマは振る舞いについて何も考えなくてよいです
> メソッド名が同じなら、同じような振る舞いをします
> なのでそうしてください
> そのあと言語仕様から変数宣言を無くして代入で代用してください
> 一見すると「変数宣言」と「代入」の区別がつかなくなるように思えるかもしれませんが
> 変数宣言が無くなるので変数のスコープのことを考えなくてよくなります
> これらはPythonでサポートされているので、そのようにしてください

試しに Ruby を Python に変えて見たけど、何ら違和感が無い
そもそも「オブジェクト指向+動的型付け+手続き型言語」という特性を備えた
あらゆる言語(Python/JavaScript/Perl/PHP..etc)に通じる単純明快な事柄だね
いったいぜんたい >>294 は何を言いたいのだろうか?

あえて >>294 の主旨をエスパーすると:
「私はプログラミングを習い始めたばかりの初心者です、よろしくお願いします」
ってことではなかろうか
2017/09/17(日) 21:59:40.46ID:iyMogwhx
>試しに Ruby を Python に変えて見たけど、何ら違和感が無い

それで何が問題?
あと、Pythonは型アノテーションを取り入れてるから
過去の過ちを修正していこうということだろうね
一方Rubyは逆走中
失敗しちゃったから、もういっそ、突き抜けちゃおう、という勢い
2017/09/17(日) 22:05:37.68ID:G7neoTxj
Ruby 以外の動的言語は、関数の外で宣言した変数が、
関数の内側で、使えるよな

つまり、関数スコープが厳格ではない

Rubyで、変数宣言が無いのは、関数スコープが厳格だからかな?
2017/09/17(日) 22:15:19.17ID:5DAGa3Dm
>>299
Rubyはオブジェクト指向言語なので
カプセル化するために基本的に
他のオブジェクトの変数をそのまま使わない

使う必要がある場合は引数またはアクセサを通して使う
またグローバル変数も使えるが非推奨
2017/09/17(日) 22:58:55.88ID:iyMogwhx
|x; foo|
↑の foo のような、変素宣言と変わらない素晴らしい存在と出会うことが出来ます
ちなみに python にも nonlocal という素晴らしいお友達が居ます
変数宣言を無くして代入で代用するアイデアは本当にうまく行きます
「@」に出会うことが出来るし
レキシカルスコープについて考えると夜も眠れないほどです
2017/09/17(日) 23:06:07.39ID:G7neoTxj
Ruby のブロック(クロージャ内の)変数だろ

python のnonlocal は、いらんわ。
親のスコープへ、遡って探しに行く、変数だよね
303デフォルトの名無しさん
垢版 |
2017/09/17(日) 23:20:45.74ID:vAwE04IK
>>298
>過去の過ちを修正していこうということだろうね

その Python の過ちがあまりに低レベルな訳だが:
(1) print 機能が文として実装され、ライブラリとして分離されていなかった(>>209)
  すでに1970年代に登場したC言語では、
  print は標準ライブラリ関数として言語仕様から
  分離していたにもかかわらず
(2) 整数の割り算という極めて基礎的な計算仕様が安定していない
 ・割り算の扱い – Python2からPython3への変更 –
  http://www.trusted-design.net/archives/455/
(3) 関数型言語ブームを追って行き当たりばったりで適当に実装したおかげで、
  ラムダ式の本体には式しか書けない
  改善要望は過去から存在したが、作者のGuid氏はGuido氏は
  「複数行のラムダは解けないパズル(unsolvable puzzle)」と匙を投げた(>>234)

(1)と(2)はようやく Python3 で修正を終えたけど、その代償として
「後方互換性の断絶」という事態を招いた
(3) の「解けないパズル」に至っては Python3 でも修正の目処が立たず先送り
おそらく Python4 で修正して「後方互換性の断絶」が再現されることになる

つまり Python における「過去の過ちの修正」の歴史って、こういうこと
繰り返すけど、Python は過ちのレベルがあまりに初歩的すぎるのよ
304デフォルトの名無しさん
垢版 |
2017/09/17(日) 23:28:50.19ID:vAwE04IK
>>299
>Ruby 以外の動的言語は、関数の外で宣言した変数が、
>関数の内側で、使えるよな

いや、そもそも Ruby ではメソッド定義の中で入れ子になった
メソッドは定義できないよ
これは Smalltalk や Java といった最初からオブジェクト指向言語として
設計された仲間に共通する特性


>Rubyで、変数宣言が無いのは、関数スコープが厳格だからかな?

いや、メソッドの入れ子定義を禁止したことで、スコープの定義が簡潔なだけ
というか、Python や JavaScript のような関数の入れ子定義ができる
動的型付け言語でも、関数宣言は必要無いから、何を言いたいのだろうか?
305デフォルトの名無しさん
垢版 |
2017/09/17(日) 23:36:32.98ID:vAwE04IK
>>301
>↑の foo のような、変素宣言と変わらない素晴らしい存在と出会うことが出来ます

Ruby:
 lambda { |foo| …… }
Python:
 lambda foo: ……
JavaScript:
 function(foo) { …… }
Scheme:
 (lambda (foo) …… )
SML:
 fn foo => ……

言語によってブロック、ラムダ式、無名関数と呼び名は様々だけど、
どの言語でも「変素宣言と変わらない素晴らしい存在」foo とは出会えるよ
ひょっとして >>301 は「仮引数(パラメタ)」という概念を知らないのかなあ?
306デフォルトの名無しさん
垢版 |
2017/09/17(日) 23:54:56.42ID:vAwE04IK
>>304
>動的型付け言語でも、関数宣言は必要無いから、何を言いたいのだろうか?

最後の文章を自己レスで訂正:
X:関数宣言は必要無いから、
O:変数宣言は必須では無いから、

補足しておくと:
・JavaScript は予約語 var で始まる変数宣言の構文があるけど、
 省略すれば暗黙的に宣言される
・Python の型アノーテーションは、その名アノーテーションとあるように
 コメント扱いだから変数宣言の意味とは全く異なる存在であるし、
 当たり前だけど省略できる
2017/09/18(月) 00:24:39.32ID:Rs/BRyvp
> Ruby:
>  lambda { |foo| …… }
ではなく
Ruby:
 lambda { |x; foo| …… }
この仮引数ではない余計な「foo」の事ですよ
明らかに浮いてますね、変ですね
何なんですかね、このfoo
変数宣言を代入で代用するアイデアは本当に素晴らしいですね

>(2) 整数の割り算という極めて基礎的な計算仕様が安定していない
http://postd.cc/sick-of-ruby-dynamic-typing-side-effects-object-oriented-programming/
Ruby: それはstdlibが搭載されているモジュールをrequireすると、
整数割り算の動き方に影響を与えてしまう言語。 @tomdale
308デフォルトの名無しさん
垢版 |
2017/09/18(月) 01:38:17.76ID:+b1AQYPX
>>307
>Ruby: それはstdlibが搭載されているモジュールをrequireすると、
>整数割り算の動き方に影響を与えてしまう言語。 @tomdale

それは整数割り算のメソッドをオーバーライド(上書き)したからだよ
リンク先の文書だとモジュール “mathn” を require で指定しているね

外部モジュールの import うんぬんとは無関係に、バージョンによって
素の「整数割り算の動き方」が変わってしまうナイスジョーク言語(>>209)と
一緒にしないでね!!(棒
2017/09/18(月) 02:48:06.01ID:nAoTSCTK
>>307
>変数宣言を代入で代用するアイデアは本当に素晴らしいですね

へ??
2017/09/18(月) 04:01:15.69ID:rETRD+xz
lambda { |x; foo| …… }

ブロック(クロージャ内の)変数として、使いたい場合、
わざと、foo に代入しない

JavaScript でも、undefined が予約語ではないから、
わざと引数に代入せずに、undefined を作る方法がある
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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