X



Ruby 初心者スレッド Part 63
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/04/17(火) 17:46:57.87ID:GYuBFjQi
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0734デフォルトの名無しさん
垢版 |
2018/08/18(土) 14:45:55.55ID:h7OdrOPI
frozenになるだけでオブジェクトは別に作られるのかと思ったらこれじゃ本当にSymbolと変わんねえなw
でもSymbolもなんだかんだ好きだけど

ruby --enable=frozen-string-literal -e 'p 1000.times.map{"foo".object_id}.uniq'
#=> [20966820]
0735デフォルトの名無しさん
垢版 |
2018/08/18(土) 14:49:31.46ID:h7OdrOPI
あもともとfrozenな文字列は使いまわしてたのか
$ ruby --disable=frozen-string-literal -e 'p 1000.times.map{"foo".freeze.object_id}.uniq'
[20983260]
0736デフォルトの名無しさん
垢版 |
2018/08/18(土) 16:08:23.94ID:Aune6CZV
>>733
MatzがしれっとSymbolをStringのサブクラスに変更しようとしたの知らんのか
結局互換性の問題でMRIメンバーから大反対されて却下されたけど、
今Rubyを完全に再設計するならまず間違いなくシンボルリテラルは単なる文字列になり、Stringは常に変更不可になる
Railsのパフォーマンス改善のためにRubyに導入されたシンボルGCなんて、
それこそ本来のシンボルの意味からすると全く必要ないはずの馬鹿げた機能だ
もはや誰が見てもSymbolは事実上単なる文字列
0737デフォルトの名無しさん
垢版 |
2018/08/18(土) 18:57:05.66ID:IyhzoKxX
最下位bit使って
整数の範囲を減らしてまで
シンボル空間作ったのに
互換性無いですかそうですか
0738デフォルトの名無しさん
垢版 |
2018/08/18(土) 21:19:08.78ID:NYofKyoT
>>731
>メタプログラミングのため

後半の内容とは何ら関係しない
覚えたてのメタプログラミングって単語を使いたいだけちゃいますか


>Railsの影響でシンボルをキーにしたHashを引数に渡すということがよく行われるけど、

Railsで最初にRubyに触れた人にとってはそう感じるだろうけど、
ハッシュのキーとしてシンボルを使うのはRails以前から普通だったよ


>>736
>Railsのパフォーマンス改善のためにRubyに導入されたシンボルGCなんて、

シンボルGC導入のきっかけは(ブルートフォース攻撃に対する)セキュリティ対策だよ
パフォーマンス改善のために導入された文字列のfrozenデフォ化とごっちゃにしてる
0741デフォルトの名無しさん
垢版 |
2018/08/19(日) 01:31:27.62ID:wM6XArJ0
Selenium WebDriver, Nokogiri を使って、文字列からHTML を作って、
それをJavaScript で実行して、DOM を更新しているけど、
こういう原始的なやり方で良いのかな?

もっと、ERB とか、Vue.js みたいな、UI コンポーネント指向の書き方はできないのかな?

doc = Nokogiri::HTML(driver.page_source)
content_wrapper = doc.at_css("#content") # 全体の枠

# 画像ノード
img_wrapper_str = <<"EOT"
<div class="img_wrapper"><img></div>
EOT

picture_urls.each do | pict_url | # 画像のURL
img_wrapper = Nokogiri::HTML::DocumentFragment.parse img_wrapper_str

img = img_wrapper.at_css "img"
img.set_attribute('src', pict_url) # 属性

img_wrapper.parent = content_wrapper # 親
end

jsCode = <<"EOT"
var elem = document.getElementById("content");
elem.innerHTML = '#{ content_wrapper.inner_html }';
EOT

driver.execute_script jsCode # JavaScript を実行
0742デフォルトの名無しさん
垢版 |
2018/08/19(日) 08:45:22.44ID:vb2L7br6
すいません、プログラミングの世界に最近初めて入ったんですけど
C++やろうとしたら別のスレでRubyとjava勧められたのでやろうと思ってるのですが
Rubyはプログラム初心者に向いてますか?
それと実行環境はVisualStudioを使えますか?
この2点教えてください
0743デフォルトの名無しさん
垢版 |
2018/08/19(日) 08:50:30.37ID:5Q8kr7ts
>>742
Rubyは開発陣がWindowsアンチばかりでWindowsとRubyは極めて相性が悪い
初心者云々以前に、Macに乗り換える気がないならRubyは論外
WinでスクリプトならPythonにしよう
絶賛落ち目中のRubyよりよほど将来性があるし初心者にもわかりやすいしWinで使いやすいしVisual Studioでもサポートされている
0745デフォルトの名無しさん
垢版 |
2018/08/19(日) 09:52:05.30ID:wM6XArJ0
RubyInstaller for Windows がある。
エディタは、VSCode

ただし、Windowsで、irb を使うと、日本語でバグるから、
irb だけは、Windows10 なら、WSL でLinux(Ubuntu)側から使う

paiza.IO, codepad などのサイトで、ブラウザからプログラミングするのが簡単。
他には、progate という学習サイトもある

環境構築には、数十のLinux コマンドも覚えるべき。
絶対・相対パス、環境変数PATH の仕組みなども知らないと無理

ruby -v
例えばこういう、ruby のようなパス無しのコマンドを入力すると、
どういう仕組み・順序で、PC 内から、そのコマンドの実行ファイルのある場所を探し出すのか?

つまり、こういうOS の知識がないと、
コマンドプロンプト・PowerShell などのシェルを使えない

ほとんどの人は、これらの勉強ができず環境構築ができないから、
環境構築のいらない、Excel エンジニアになるしかない!

つまり、プログラマーにはなれない人!
0746 ◆QZaw55cn4c
垢版 |
2018/08/19(日) 10:20:51.08ID:bW/fB7v7
>>742
C++ をやるんだったら Java にすればいいと思います
0747デフォルトの名無しさん
垢版 |
2018/08/19(日) 10:58:48.68ID:vb2L7br6
>>743
そうなんですか。Win10使ってるんですけどやめたほうがいいですか...
別スレでC++始めるならまずたのしいRuby 第5版、2016 とスッキリjavaやってからにしとけって言われたので
聞いてみたのですがあまりよろしい選択ではなかったですか。
色々調べてみるとrubyは簡単な言語の上位にランクインしてたので覚えやすいのかなって思ってたんですが

PythonはVisualStudioで出来るんですね。いいこと教えていただきありがとうございます。
>>745
一応VisualStudioでRubyもやれるんですか
LinuXはOS?ですか?あまり良くわからないんですが、かなり敷居は高そうですね……
paiza等もブラウザで出来るみたいなんですが入力とかクラスとかの機能が使えないみたいで
色々不自由しそうで、なるべく実行環境整えたいのですが、今の段階では厳しいですか。
教えていただきありがとうございます。
0749デフォルトの名無しさん
垢版 |
2018/08/19(日) 11:07:38.97ID:f0B2PJq7
>paiza等もブラウザで出来るみたいなんですが入力とかクラスとかの機能が使えない
そんなことはない普通に使える
実行環境構築に自信がないならブラウザコンソールからJavascriptやっとけ
0750デフォルトの名無しさん
垢版 |
2018/08/19(日) 11:08:29.44ID:vb2L7br6
>746
別スレで教えていただきjava環境導入出来ました。ありがとうございます!
せっかくお勧めの入門書2冊教えてもらったので両方の言語やろうかなって思って聞いてました
少しでもC++の理解が簡単になるならやっとこうと思ったんですけど無意味ですかね
0752デフォルトの名無しさん
垢版 |
2018/08/19(日) 11:20:28.30ID:vb2L7br6
>>748
そこまで本格的にやる予定ではなくて,
別スレでプログラム0から始める奴がC++からやっても理解できない。
たのしいRuby 第5版、2016 とスッキリ分かるjavaやってからにしろ!って言われて
少し遠回りしてでもやろうと思ってたんですが、今聞いた感じだとあまり入門者がやる言語ではないみたいですかね…
pythonとjavaとりあえずやってみます。ありがとうございました
0753デフォルトの名無しさん
垢版 |
2018/08/19(日) 11:28:00.78ID:oQXHWYB7
C++やるつもりならなおさらPythonがおすすめだな
Pythonは設計思想が比較的C系に近いからC++やJavaにも馴染みやすいよ
RubyはRubyが最高だと信じて閉じ籠って他の言語やりたがらない人が多い
0754745
垢版 |
2018/08/19(日) 11:42:35.15ID:wM6XArJ0
「たのしいRuby」「スッキリjava」は薦めたのは、俺だよ

Windows のユーザー・システム環境変数の設定画面を使えないと無理。
この画面の環境変数PATH を、穴のあくほど見つめる。
新しく何を追加したのか

絶対・相対パスの違い。
これがわからないと、VSCode で、PowerShell から実行できない

cd, ls などの、基本的な20ぐらいのLinux コマンドも覚えるべき。
PowerShell でも、そのまま使えるから。
例えば「cd ..」これの意味がわからないと、PowerShell を使えない。
コマンドプロンプトはややこしいから、なるべく使わない方が良い

C++ なんて、5年以上先の話。
環境構築できないと無理

paiza.IO, codepad などのサイトで、ブラウザからプログラミングするのを薦める。
progate という学習サイトで学習する人も多い
0756745
垢版 |
2018/08/19(日) 11:50:54.76ID:wM6XArJ0
「たのしいRuby」「みんなのPython」「スッキリjava」の3冊を読めばよい

「たのしい・みんなの」の2冊は双子。
ただし必ず、たのしいから読むこと!
みんなのから読むと、わからないから苦戦する

ただし、みんなのは、AI・機械学習しない人には、無駄が多い。
ウェブ系なら、たのしいRuby

HTML, CSS, JavaScript も必要
0757デフォルトの名無しさん
垢版 |
2018/08/19(日) 11:59:42.65ID:EuNb7t2q
今からJavaをするくらいなら、C#をしたほうが一億倍はいいと思うが。
とくにWindowsなら。
0758デフォルトの名無しさん
垢版 |
2018/08/19(日) 12:01:03.16ID:AHbKk0RR
>>742
プログラミング言語は道具だ。道具を使って何をしたいか(目的)が重要なのではないのかな
逆に目的が決まれば適したプログラミング言語も自然と絞られてくる
なんとなくならメジャーなのをやっておけとしか・・・
0759745
垢版 |
2018/08/19(日) 12:04:48.91ID:wM6XArJ0
例えば、C++ のロベールを読むよりも、

「たのしいRuby」「みんなのPython」「スッキリjava」の3冊を3回読む方が、
はるかに速く読めるし、得るものも大きい。
50時間もあれば、全部読める

一方、C++ で50時間使っても、ほとんど何も作れない。
やってみればわかるけど、時間の無駄

C/C++ などポインタがある言語は、すぐにバグるから、すごく時間を損する
0760745
垢版 |
2018/08/19(日) 12:52:39.81ID:wM6XArJ0
https://rubyinstaller.org/

Ruby Installer を使うなら、2.4 系を使う。
2.5 系は、まだ新しいから使わないように

irb は日本語でバグるから、使わないように。
使うなら、WSL でLinux(Ubuntu)側で、irb を使う

VSCode もインストールして、Rubyの拡張機能も入れてみれば?
0761デフォルトの名無しさん
垢版 |
2018/08/19(日) 13:14:24.10ID:CsoxUTBy
環境変数がわからないのはともかく自分で調べて理解できないレベルなら諦めろ
0763デフォルトの名無しさん
垢版 |
2018/08/19(日) 13:35:43.71ID:plhuPGbS
web上では見たことあるけど
出版物上で観るのは初めて感
0766745
垢版 |
2018/08/19(日) 14:30:49.79ID:wM6XArJ0
言語の初心者用の本は、PCの初心者用の本じゃない!

言語の本はあくまで、その言語を知らないだけで、
環境変数とか、絶対・相対パスとか、cd, ls などの基本コマンド、
PowerShell の使い方などは、知っている事が前提

こういうOS の知識を、教えている本はない。
それを書けば、言語を説明するページが減るから、書かない

つまり言語の本は、PCの初心者を対象としていない!
既に、OS の知識はあって、その言語だけを知らない人向け
0768745
垢版 |
2018/08/19(日) 14:46:26.87ID:wM6XArJ0
762 みたいな本を書いている奴は、勉強を何もわかっていない。
なぜ生徒が、プログラミングを嫌うか

言語には、勉強する順番がある。
小学生にいきなり、大学教育をしても無駄。
小中高大学と、個人の成長には、勉強する順番が重要。
知識を下から、積み重ねていかないといけない

1. 動的・軽量言語
Ruby, Python, JavaScript

2. 静的言語
Java, Kotlin, C#

3. ポインターのある言語
C, C++

今の大学教育では、C から教えているから、皆プログラミングはしょーもないってやめる。
これは、Rubyの女神・女優の池澤あやかが言ってる
0769デフォルトの名無しさん
垢版 |
2018/08/19(日) 15:14:41.19ID:CsoxUTBy
>>768
教養時代に必修科か準必修科目でRubyやったぞ
薬学とか農学部進学予定の奴までやってたのはかわいそうだったけど
0770デフォルトの名無しさん
垢版 |
2018/08/19(日) 15:33:42.02ID:aRJ7Tr37
>>753
つまり、Python信者は他言語スレまで出張してPython推しするほど必死だと
0772デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:00:26.64ID:wM6XArJ0
ラズパイでは、Python も良いけど

ウェブ系では、Ruby が強い。
Rails から、Vue.js, React も使える
0775デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:35:26.45ID:plhuPGbS
プッ
0777デフォルトの名無しさん
垢版 |
2018/08/19(日) 17:01:32.24ID:aRJ7Tr37
>>743
つまりPython推しのためであれば、他言語スレでの荒らし行為も正当化されると
いやあPython信者って怖いですね
0778777
垢版 |
2018/08/19(日) 17:02:42.12ID:aRJ7Tr37
アンカミスを訂正:
 X:>>743
 O:>>776
0779デフォルトの名無しさん
垢版 |
2018/08/19(日) 20:07:29.27ID:xR7/CWZ6
俺はPythonよりRubyの方がずっと好きだけど
(Railsプログラマーを目指してるんでもなきゃ)
これから何か始めようって人には断然Pythonを薦めるし
自分のお気に入りだからってむやみにRubyを薦める奴の見識は疑うね
0781 ◆QZaw55cn4c
垢版 |
2018/08/19(日) 21:12:05.24ID:bW/fB7v7
>>780
CASL なんて覚える気になりません、といって、x86 のいい教科書がありませんね
誰か書いてほしい
0782デフォルトの名無しさん
垢版 |
2018/08/19(日) 22:30:32.56ID:aRJ7Tr37
>>779
つまり:

 俺はRubyよりPythonの方がずっと好きだけど
 (機械学習プログラマーを目指してるんでもなきゃ)
 これから何か始めようって人にRubyを薦めることもあるけど
 自分のお気に入りだからってむやみにPythonを薦める奴の見識は疑うね

ってことですね
Python信者の皆様、お勤めご苦労様です
0783デフォルトの名無しさん
垢版 |
2018/08/19(日) 22:56:05.02ID:xR7/CWZ6
>>782
そりゃひねくれすぎだろ…お前いったい何と戦ってんの?

ただでさえRubyの評判は落ち目なんだから
狂信者が必要以上に貶めるのはやめにしてほしいわ
0784デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:09:03.67ID:wM6XArJ0
>>780-781
2人のイリノイ大学生が使った、LLVM に世界が飛びついたけど、
日本では既に情報処理資格に、仮想アセンブラ CASL2 があった

LLVM/Clang 実践活用 ハンドブック、出村成和、2014

詳説 Cポインタ、2013、オライリー・ジャパン

OSのすべての機能を学びたいなら、ムック本の
Linuxエンジニア養成読本、第3版、2016
0785デフォルトの名無しさん
垢版 |
2018/08/19(日) 23:56:53.17ID:/dQ+RHN7
>>752
プログラミングの基本って、
・変数への代入、関数(メソッド)の使い方
・配列、ハッシュ(連想配列)とかのデータ構造
・値の比較と条件分岐(if文とかswitch文)
・繰り返し処理(do while文とか)
こういうのだけど、これはどの言語にもあるものだから、
一度覚えればほぼそのまま使い回しがきく。
(if文じゃなくてif式、とか若干の違いを言語ごとに覚えるだけ)

あとは「オブジェクト指向」の考え方というか、
概念みたいなのを理解できてれば、
どの言語に移ってもそんなに苦労せず使えるようになる。

で、そういう基本は、C++でもJavaでもRubyでもPythonでもJavaScriptでも、
どれやったって学べるわけだけど、
最近は3DCGのアプリとか、機械学習とかのジャンルで
Pythonが採用されるケースが多いので、
ゼロから始めるなら使い道の多いPython、みたいな意見がどうしても多くなる。
(Rubyは使いやすい言語だけど、Webサイト構築以外での採用例があまりない)

けど、「自分のやりたいこと」がなにかを決めた上で、
「それを最短距離でできる言語はどれか」を
詳しい人に教えてもらって始めるのが一番おすすめ。
(自分のやりたいことがC++でないとできないなら、最初からC++をやるべき)

特にやりたいことがなければ、
本屋で各言語の入門書をいろいろ立ち読みして、
自分が理解できそうな言葉で書いてあるやつを選んで始めれば、と思う。

ちなみにPythonもJavaも、初心者が学ぶ言語としては
悪くない選択肢です。
0786デフォルトの名無しさん
垢版 |
2018/08/20(月) 00:34:57.15ID:6r2cvJMF
>>785
Pythonは3DCGでは最近じゃないから
ほとんどの奴がPythonの存在を知らないときから使われてる
0790デフォルトの名無しさん
垢版 |
2018/08/20(月) 10:03:01.56ID:1nsldRzy
まぁ古参はC、下手したらアセンブラからの経験者で
トレンドに合わせてステップアップしながら言語を覚えただろうから
初心者が何の言語から勉強するべきかなど分かるはずもないんだよな

シンプルで覚えることが少なく今なお第一線級で活躍している言語なら間違いなくC言語
C言語ほどシンプルで実用性のある言語はない
OSが書かれてる本物の言語ってだけでもモチベーションになる
全ての実用言語の元になってると言えるし、最初にやるには良い言語だ
良くも悪くも

一方で楽しさ優先なら間違いなくC#でポトペタ開発でしょ
めちゃ楽しいが、WPFなどの背景にある仕組みの複雑さに挫折するかも
でも触ってて楽しいだろうなぁ、画面作るだけならマウスだけで出来るし

あぁRubyとかPythonとかは寄り道みたいなものだから最初にしなくてよいよ、ハマるから
動的型のスクリプト言語など色物なのに、最初にやるとか、どうかと
俺は絶対おすすめしないね、プログラミング言語の本流じゃないからね
特にここ10年は静的型が本流ってみんな知ってるだろ、いじわるめが
0791デフォルトの名無しさん
垢版 |
2018/08/20(月) 10:13:16.57ID:1nsldRzy
あと、環境設定がどうとか、約一名盛り上がっているようだが
そういう人にはVisualStudioがおすすめだろう
これだけ完成度の高いソフトが無料で使えるのは凄すぎる
トータルで言えば、初心者におすすめなのは
VisualStudioとC#でポトペタ開発って事になるのかな
でもまあ、C#もバージョンがどんどん上がって今やとても複雑な言語だからなぁ
ソフトウェア業界が10年20年かかって常識にしてきたことを
一気に追体験しようというのはなかなか酷だわな
本当はC言語とWin32APIあたりから始めるのがシンプルで理想なんだが
モチベーションがつづくかな、それさえ気にしなければよい選択なんだが
どちらにせよ、RubyやPythonのような本流主流じゃない言語を最初にやるのは止めたほうが良い
筋が悪い、悪かった、というか悪いお手本みたいな言語だから
0792デフォルトの名無しさん
垢版 |
2018/08/20(月) 10:21:38.59ID:1nsldRzy
手続き型言語でプログラム書くなら、どのみちメモリのことは意識しなければならないし
ポインタが分からないって時点でプログラマには向いてないというか何というか
ただ、結局、安全かどうかなんだよ
その点C言語は安全とは言い難いが
意図せずヌルポするのはヌル安全の機能が無い言語ではどれも同じようなものじゃろ

その観点から言うと、単なるタイポすらコンパイル時にチェックしてくれない
動的型言語は初心者に進めるのは止めたほうがよい
初心者ほどタイポするだろうからな
それが言いたかった
0796デフォルトの名無しさん
垢版 |
2018/08/20(月) 15:18:21.21ID:qTCaqW3V
>>792
> 単なるタイポすらコンパイル時にチェックしてくれない動的型言語

(きっとRubyのdid_you_meanはおろか70年代のLispにすらあったDWIMも知らないんだろうな…)
0798デフォルトの名無しさん
垢版 |
2018/08/20(月) 15:30:49.82ID:1nsldRzy
とにかく、初心者はプログラムを間違えるものなんだよ
一発で動くことは先ずない
それならコンパイルの時点でよりたくさんのエラーを検出してくれた方が学習が捗るだろ?
初心者にRubyなんか薦めるなって事だ
その人を蹴落としたいなら別だが
0801デフォルトの名無しさん
垢版 |
2018/08/20(月) 16:43:09.37ID:GIvuOFoC
>>799
重要なのはプログラム実行前ってことだよ
静的とも言う。

実行した後はいろんな状態があり得るが
実行前というのは状態は一つだ。

つまりいろんな状態にしなければわからないというのは
問題を発見するまでに果てしなく時間がかかるということ
だからなるべく実行前にわかるようにするのが良い
0802デフォルトの名無しさん
垢版 |
2018/08/20(月) 16:47:09.67ID:fD9Nu4LZ
いやeval getsするだけで可能性は可算無限でしょ
eval gets
p A
# input
A = 'hoge'
とかどうすんのよ
0806デフォルトの名無しさん
垢版 |
2018/08/20(月) 18:09:19.60ID:1nsldRzy
何だったらコンパイル時どころか
最近のエディタだったら書いてる途中でリアルタイムで文法チェックするからな
間違ってたら波線とか出る
そういう状況なので、なるたけ多くのことが静的にわかったほうが良いんだよ
実行時にエラーにするなら馬鹿にでもできる!!って思うし
やってみてダメでしたってな、バカっぽいでしょ
事前に分かるから賢い
0809デフォルトの名無しさん
垢版 |
2018/08/20(月) 18:50:47.34ID:fD9Nu4LZ
このスレって質問者をほっぽりだして変なのがしゃしゃり出てくること度々あるよな
0811デフォルトの名無しさん
垢版 |
2018/08/20(月) 20:37:42.02ID:GIvuOFoC
>>810
いや、自分で書いたコードの話なんだけど?
Smalltalkは自分の書いたコードがすでに動いてないと
そういうエラーはでないでしょ。
0812デフォルトの名無しさん
垢版 |
2018/08/20(月) 20:43:46.47ID:NYBtZzEL
>>811
バカなの?コンパイル時って言ってるやん何度も

ともかくスペルミスくらいなら動的型言語でも静的にチェック可能なの

わっかんないやつだなー
0813 ◆QZaw55cn4c
垢版 |
2018/08/20(月) 20:48:48.89ID:VU5jvdn2
>>812
>スペルミスくらいなら動的型言語でも静的にチェック可能なの
型宣言がないのに、そんなことが可能なのでしょうか?
0814デフォルトの名無しさん
垢版 |
2018/08/20(月) 20:56:45.04ID:GIvuOFoC
ローカル変数だけだったりしてねw

近くの情報は周辺を見ればいいだけだから問題はすぐに分かるんですよ。
遠くの情報、例えばインターフェースが一致しているかどうかが
わからないと使い物になりませんね
人間がやると大変なものこそコンピュータにやらせないと
0815デフォルトの名無しさん
垢版 |
2018/08/20(月) 21:35:34.32ID:1nsldRzy
なんで静的型の後追いみたいなことで苦労してるんだろうね
初めから静的型言語使えばよいだけなのにね
怠惰を求めて勤勉に行き着くってやつなのかね
動的型全体がそうだよね
処理系書いてる連中も、言語使ってる連中も
楽しようとして最終的に苦労する
なにこれコワイ
0816デフォルトの名無しさん
垢版 |
2018/08/20(月) 21:43:42.44ID:NYBtZzEL
>>813
構文木にできれば(ローカルに限らず)未宣言の変数だとか未知のメソッド呼び出しだとか程度なら
簡単に分かる
Lispみたいに構文も単純なら構文ミスも指摘して修正候補を提示することも可能(例:InterlispとかのDWIM)
0817 ◆QZaw55cn4c
垢版 |
2018/08/20(月) 21:52:27.57ID:VU5jvdn2
>>816
>未宣言の変数だとか
動的型付け言語ってそもそも変数宣言はないのでは?
0818デフォルトの名無しさん
垢版 |
2018/08/20(月) 22:15:42.75ID:NYBtZzEL
>>817
変数を宣言させるかとそれに型情報が付くかどうかは別の話だよ
変数宣言をさせたら動的型言語じゃなくなるという法はない
宣言を課さない言語でも初回代入を宣言と見なす場合もある
0819 ◆QZaw55cn4c
垢版 |
2018/08/20(月) 22:20:21.86ID:VU5jvdn2
>>818
>変数宣言をさせたら動的型言語じゃなくなるという法はない

たしかにそのとおりですが、
でも実際問題、変数宣言をしてかつ動的型付けである言語は存在しますか?
0820デフォルトの名無しさん
垢版 |
2018/08/20(月) 22:29:16.58ID:1nsldRzy
そんなの珍しくないよ
JavaScriptとかな
変数宣言には二つの役割があって、一つは型を宣言することだけど
もうひとつスコープを宣言するって役割もある
だから動的型言語でも素直なレキシカルスコープが欲しければ変数宣言があってもよい
一方で変数への最初の代入を変数宣言の代わりにする言語は
だいたいスコープがバグってる
ただの変数への代入か、新たな変数を宣言したのか、区別がつかないからなwww
それでnonlocalだの@だの、ダサいだろ?
ま、そういうわけで、やっぱり変数宣言は有ったほうが良いし
どうせ変数宣言するなら型を書いても良い気がするし
動的型言語が衰退するのは当たり前だったわ
なんせ、ありとあらゆるスジが悪いんだよ
0822 ◆QZaw55cn4c
垢版 |
2018/08/20(月) 22:42:40.49ID:VU5jvdn2
>>821
def f(xyz)
"Hello, #{abc}!"
end

というメソッド定義があって
本当なら変数として xyz のところを間違えて abc と書いてしまった
というシチュエーションでも、エラーがでないでしょう?
0823デフォルトの名無しさん
垢版 |
2018/08/20(月) 22:52:22.44ID:KNimMRpP
>>822
あのさぁ…宣言を課すこととミスを検出できるか(するか)どうかはまた別の話なんだが?

今は「変数宣言をしてかつ動的型付けである言語は存在しうるか?」って話なんじゃないの?
0824 ◆QZaw55cn4c
垢版 |
2018/08/20(月) 22:58:45.39ID:VU5jvdn2
>>823
「宣言を課す」というのは「宣言をしていない変数は変数として認識しない」という意味なのでは?
0827デフォルトの名無しさん
垢版 |
2018/08/20(月) 23:55:25.50ID:PXXr8Lzz
>>824
Rubyはそうしていないというだけで、コンパイル時に
abcが未代入(代入操作で宣言を兼ねるRubyでは未宣言にあたる)である事実や
あるいはメソッドとして未定義である事実をもってxyzとすべき記述のミスでは?との判断を下し
そうであれば修正を促すことは可能だろう?

予め釘を刺しておくけど、ミスの可能性があることとコンパイル可能であることとはまた別の話だからな!
0828デフォルトの名無しさん
垢版 |
2018/08/21(火) 00:12:58.46ID:TQPukUfs
>>824
もしかして
Rubyでは無引数(括弧なし)のメソッド呼び出し記述は同名のローカル変数のアクセス記述を遮蔽してしまう
っていう仕様をしらないとかいうオチ?

もしこのルールがなければ>>822はキミの想定通りエラーのはずだよ
0829デフォルトの名無しさん
垢版 |
2018/08/21(火) 00:21:47.25ID:kxzeRRBS
JavaScript では、var の有無で、皆ハマった。
だから、ES2015(ES6) で、let, const を作って、ブロックスコープも作った

this の挙動もおかしい。
だから、Haxe のthisは、常にインスタンスを指すように変えられた

Python でも、nonlocal とか、頭おかしいw

Ruby では、関数スコープ・ブロックスコープの2つがあるから、バグりにくい

a = 1

def f
puts a # ここで、未定義の変数を参照してエラー
puts a = 2
end

f()
0830 ◆QZaw55cn4c
垢版 |
2018/08/21(火) 00:34:00.24ID:Wpz7rvAB
>>827
>代入操作で宣言を兼ねる
これは危険ですね
なぜなら、変数が未代入かどうか、正確には、変数が未代入「でないか」どうか、をソースコードのセマンティクスから判断するのは困難だと思うのです
0831デフォルトの名無しさん
垢版 |
2018/08/21(火) 01:41:26.90ID:WMlArXdo
>>827
Rubyは、未定義メソッドの呼び出しが可能なんじゃないか?
そのためのフォールバック用メソッドがあったはずだが。
0832デフォルトの名無しさん
垢版 |
2018/08/21(火) 01:47:26.07ID:kxzeRRBS
メタプログラミング Ruby 第2版、2015

で紹介している、Module#define_method(), method_missing() とかだろ?
■ このスレッドは過去ログ倉庫に格納されています

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