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/23(土) 19:23:40.35ID:xCJjTQ1w
>>368
なにこいつ(|||´Д`)
2017/09/23(土) 20:26:38.45ID:WtNBJIHg
rubyスレでも、達人はいなくなったんですね。寂しい限りです。
2017/09/23(土) 20:30:41.03ID:b6I3iAXW
もともといない
2017/09/23(土) 20:46:17.06ID:WtNBJIHg
>>373
ID導入の数年前までは少しいましたよ。今は、rubyの達人さんたちはどこにいるんでしょうか?
375デフォルトの名無しさん
垢版 |
2017/09/23(土) 21:42:42.17ID:lJM5VEju
>>354
いくつか勉強不足な箇所はあるけど、「スコープがぐちゃぐちゃ」という
指摘に関しては、まったくもってそのとおりだね

>>> x = 1  # グローバル変数 x を初期値 1 で宣言
>>> def f(dx): x = x + dx  # 変数 x を破壊的に更新する手続き f を定義
... ^D
>>> f(2)  # 手続き f を引数 2 で呼び出してみると・・・
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
UnboundLocalError: local variable 'x' referenced before assignment

まさに公式文書に書かれている通りの結果になった:
 https://docs.python.jp/3/glossary.html#term-nested-scope
   ネストされたスコープはデフォルトでは変数の参照だけができ、
   変数の代入はできないので注意してください。

では、続けてみよう
>>> array = [1,2,3]  # グローバル変数 array を初期値 [1,2,3] で宣言
>>> def f(x): array.append(x)  # 変数 array を破壊的に更新する手続き f を定義
... ^D
>>> array  # 念のため、変数 array の内容を確認
[1, 2, 3]
>>> f(4)  # 手続き f を引数 4 で呼び出してみると・・・
>>> array
[1, 2, 3, 4]  # あれれ、グローバル変数なのに書き込みできてしまったぞぉ?!(棒
2017/09/23(土) 21:49:13.50ID:WtNBJIHg
ああ。このレベルなんですか。このスレは。よく分かりました。
377357
垢版 |
2017/09/23(土) 23:11:57.93ID:lJM5VEju
Python を知らない人には >>357 はワケワカメだと思うので補足しとく

変数への破壊的代入を基本とする大半の手続き型言語、例えば Ruby や JavaScript、
さらには古典的な Pascal や C において、スコープは以下のように定義される:
 (1) あるスコープの内側で宣言された変数は、スコープの外側にあるコードから読み書きできない
 (2) あらゆるスコープの内側のコードは外側の変数を自由に読み書きできる

ところが Python という言語だけは、ナゼか (2) をオレ様定義した
 (2)’ あらゆるスコープの内側のコードは外側の変数を自由に読めるが、書き込みはできない

まあそんなオレ様定義も設計哲学やら個性と見れば批判にはならないのだけれど、
>>375 で実際のコードを使って示したように、このオレ様定義が実装されたのは
数値や文字列といった単純型だけで、配列/集合/辞書およびユーザ定義クラスといった
複合データ型では実装を忘れたものだから、何のためのオレ様定義だったの?と批判されている

おまけにこのスコープ問題を解決するために世の中の常識的なスコープ定義へ訂正するという
根本策を採用せず、わざわざ予約語 nonlocal やら grobal を消費してまで変数宣言文という構文を
追加するといふ「行き当たりばったりで適当な泥縄実装」を Python3 でやらかしたものだから、
>>354氏が指摘したように「スコープがぐちゃぐちゃ」になったわけです

このスコープ問題もラムダ式問題(>>303 の (3))と同様に Python4 で修正されて
「後方互換性の断絶」が再現されるんでしょうね
2017/09/23(土) 23:21:12.35ID:b6I3iAXW
>>376
このスレに達人がいると言うつもりもないけど
そんな一方的に上から目線になるほど
レベルの高いレスしたの?

>>365
>rbは複雑ですがshell scriptと考えれば、
>rbはplと比較するものではなく、bashの仲間です。
こんなのただの雑な印象論で
別にレベル高くないと思う

「Rubyってbashの仲間だよなー」って思ってる
Rubistがどれくらいいるかね?
379357
垢版 |
2017/09/23(土) 23:34:44.90ID:lJM5VEju
>>359
>変数宣言とスコープが今の論点の一つなんですか?

いいえ、それらがホットな論点であるのは Python といふナイスジョーク言語だけです(>>377)


>>362
>ヘンな弱みみたいになってるかも。

あまりにひどい言い方ではないでしょうか(棒
Ruby のそれは単純明快なブロックというスコープの内側だけで有効なローカル変数宣言の構文です
それに対して Python は nonlocal などといふ否定形の単語で「非ローカル変数宣言」という
前代未聞で意味不明瞭な構文を追加してしまったんですよ

Ruby のそれが「ヘンな弱み」なら Python のそれは「トラウマレベルの致命的欠陥」です
でも、そこまで言うのはあまりに酷すぎるんじゃないかと思います(棒
かわいそうなので、Python に関する話題は止めにしませんか?
2017/09/23(土) 23:43:28.77ID:WtNBJIHg
pyでは、ブロック {} do endのサポートはされたんですか?
2017/09/23(土) 23:45:31.47ID:WtNBJIHg
>>378
そのレベルの高低は、何を基準としてでてきたんですか?
382357 改め 375
垢版 |
2017/09/23(土) 23:55:10.03ID:lJM5VEju
名前欄と>>377内のアンカが間違っていたので訂正:

>>377
X:Python を知らない人には >>357 はワケワカメだと思うので補足しとく
O:Python を知らない人には >>375 はワケワカメだと思うので補足しとく

あと >>377 の grobal はglobal の typo
2017/09/24(日) 00:06:19.23ID:ry31kkE4
pyの話やpyの言語specはすれ違いです。まず、pyを使い続けることに疑問を持ったほうがいいでしょう。
人工知能など、十数年の周期で起きているインフルエンザです。あと2年は流行が続くでしょうけど、ノイマン型の限界で研究も限界が来るでしょう。そのときにpyの人気も終息します。
どうせバイトコードにするなら実行速度など比べても仕様がないと思うんですけど。なんでどうしようもないところを気にするんでしょうか。シングルスレッド?マルチスレッド?知能が低い人の考えてることは、なんだかよく分かりません。
2017/09/24(日) 00:54:08.29ID:ZoycLPfe
>>381
>>376
自分で「レベル」って言い出したんじゃん

スレのレベルより突出して
高いレスはないって言いたいだけ
385デフォルトの名無しさん
垢版 |
2017/09/24(日) 06:59:11.54ID:bAyFiwH3
最近、このスレ以外でもマッチポンプ目的で荒らしが出没してるから気をつけて
2017/09/24(日) 09:08:31.15ID:L7/sMAP/
Pythonのスコープはひどいが、Rubyスレで言うことではないし
同じようにRubyのスコープもひどいのだから笑えない
「@」はどう見ても今時ではないし
if文などがスコープを持てないのも酷い
これらは変数宣言を無くしたからそうなった
明らか
387デフォルトの名無しさん
垢版 |
2017/09/24(日) 09:21:53.62ID:bAyFiwH3
みんな釣られないでね
2017/09/24(日) 09:32:00.62ID:L7/sMAP/
Pythonのスコープは本当にバグってて
変数への代入の有る無しでスコープが変わる
どこのスコープに属しているか調べるのに
代入の有る無しを調べなければならない
変数への代入があればインナースコープで
参照のみならアウタースコープ
つまりは 変数宣言を無くしたことで
変数宣言->変数への(最初の)代入 としたので
代入の有る無しでスコープが変わるという糞になった
これに加えてnonlocalまである
このような動作は安全性の面から好ましいという人もいるが
それは絶対嘘で、実装上の都合でそうなったに過ぎない
本当にひどいと思うが
しかしRubyのスコープが優れているという結論には繋がらない
2017/09/24(日) 09:38:59.52ID:L7/sMAP/
Pythonは一例だが
基本的に変数宣言を無くすとスコープの仕様がバグる
だから変数宣言は有ったほうが良いし
どうせ変数宣言するんならオプショナルで型をけても悪くない
という風に考えていくと、すごくありきたりな言語が出来上がる
Rubyの最初のバージョンがそういう形で出来上がっていたら良かったが
一番最初の基本的な部分で誤ってしまって今更修正できない
修正すると、ごく普通の言語の仲間入りをするがRubyではなくなる
だから素晴らしい
390デフォルトの名無しさん
垢版 |
2017/09/24(日) 09:40:47.21ID:EATy0LdH
スレ違い

なんでわざわざRubyスレ来てるんだろうかこの荒らし
寂しいの?
2017/09/24(日) 10:41:11.83ID:tu0D//Rh
>>366-369
Redmine は、Rails
2017/09/24(日) 14:06:06.63ID:ry31kkE4
便所の隅っこで、しかもrbスレでpyの話をしても、もしかしてアスペ?
393デフォルトの名無しさん
垢版 |
2017/09/24(日) 17:06:53.98ID:bAyFiwH3
10スレ程前のスレを試しに見てみ
2017/09/24(日) 19:42:53.06ID:D2B0Yv9Y
何も見えません!!
395デフォルトの名無しさん
垢版 |
2017/09/24(日) 22:11:40.34ID:bAyFiwH3
荒らしはうせろ
396デフォルトの名無しさん
垢版 |
2017/09/25(月) 00:21:12.84ID:CVLN5qtY
ID:WtNBJIHg(>>363,365,368,370,372,374,376,380,381)
 http://hissi.org/read.php/tech/20170923/V3ROQkpJSGc.html

ID:L7/sMAP/(>>368,388,389)
 http://hissi.org/read.php/tech/20170924/TDcvc01BUC8.html
397デフォルトの名無しさん
垢版 |
2017/09/25(月) 00:59:05.75ID:CVLN5qtY
>>386
>Pythonのスコープはひどいが、Rubyスレで言うことではないし

などと言っておきながら、>>388っすか?


>同じようにRubyのスコープもひどいのだから笑えない
>「@」はどう見ても今時ではないし
>if文などがスコープを持てないのも酷い

結論として、Ruby のスコープ仕様に関する具体的な問題は、
主観的なその2点だけしか見つけられないほど小さいのだと
納得しますた


>>388
>しかしRubyのスコープが優れているという結論には繋がらない

誰一人「Rubyのスコープが優れている」なんて言っていませんけど

個人的には、Rubyのスコープ仕様は複雑だけど矛盾は無く一貫しているし、
きちんと理解すれば現実のプログラミングに支障は無いと思っています
ただし、とりたてて「Rubyのスコープが優れている」と言うほどのものではない

>>354氏が指摘してくれたように、Python のスコープ仕様は世の中の常識とは
かけ離れていて、あまりに酷すぎるんです(>>375,377)
2017/09/25(月) 01:36:00.79ID:SyR0/asg
さて同胞がRubyのスレでPythonの悪口言ってますよ
皆さん擁護してあげてください
2017/09/25(月) 02:09:17.63ID:Lq2k6P7o
よっしゃ
んじゃ俺はPythonスレでRubyを的外れにディスってくるぜ!!!!!
2017/09/25(月) 05:28:37.17ID:AJ+0XaK7
リアルで話相手見つけろ
ここにおまえを構ってくれるほど暇な人はいない

受け付けているレスは初心者の質問中心だ
2017/09/25(月) 13:37:27.59ID:7SZSTs1B
瑕疵担保責任(かしたんぽせきにん)

瑕疵担保責任のポイント

民法改正で事実上期限が「無制限」になった
バグや設計のミスなどは、瑕疵担保責任
納品物に不具合があれば損害賠償を請求される可能性もある
不具合を指摘されたらすぐに行動をとるべし
軽微なミスでも先延ばししない

http://www.atmarkit.co.jp/ait/articles/1706/26/news014.html
http://itpro.nikkeibp.co.jp/atcl/news/17/052601508/?rt=nocnt

改正法では欠陥に気付いてから1年以内にITベンダーに通知すれば、
通知後5年以内は修正や報酬の減額などを求められるとしている

全ベンダーが泣いた民法改正案を解説しよう その1
http://www.atmarkit.co.jp/ait/articles/1609/14/news009.html
http://www.atmarkit.co.jp/ait/articles/1609/14/news009_2.html
http://www.atmarkit.co.jp/ait/articles/1609/14/news009_3.html

ポイント1:修補や損害賠償、契約解除の期限がなくなる

従来あった「瑕疵担保期間は引き渡しから1年」という考えはなくなる。
条文にある通り、注文者は成果物が契約の目的に適合しないことを発見したら、
その「発見したときから1年以内」ならさまざまな請求ができる。発見が10年後なら、
11年後まで請求可能なのだ。

もっとも、現実のユーザーとベンダーの関係でも、たとえ契約書に「瑕疵担保責任期間は納品から1年と」明記されていても、
「2年目以降は不具合の修正に対応しない」と主張するベンダーはまれだ。多くの場合は、納品から何年たっても、
バグが見つかればユーザーのところに飛んで行き、無償で改修するだろう。
402デフォルトの名無しさん
垢版 |
2017/09/25(月) 13:46:59.49ID:1g9PJt6J
スレ違い
2017/09/26(火) 03:49:41.39ID:m0UrTKNQ
arrayのpackメソッドってみんな全部覚てる?
俺は量が多くて覚えきれないから、いまいち何ができて何ができないか把握できない
2017/09/26(火) 03:52:37.86ID:w3seKs+r
packとかそもそも使わない
405デフォルトの名無しさん
垢版 |
2017/09/26(火) 04:26:57.32ID:q4PyBsS5
バイナリいじったり、作ったりするときに使う
その都度リファレンスを読み返すけど
2017/09/26(火) 09:37:33.97ID:fZxiOEU0
>>403
だいたい何ができるかだけは覚えておく
詳細は覚えるだけ無駄なので毎回マニュアル見る
個人的にはこれまで使った回数合わせても10回くらいだと思う
2017/09/26(火) 21:26:43.24ID:U5HCny0u
使う回数多ければ自然と覚えるだろう
文字列扱うやつなら正規表現とかみたいに
2017/09/26(火) 23:01:09.68ID:qHxce6jn
packフォーマットってある意味暗号だよな
かと言ってFiddle::CStructとかFFI::Structとかは文字列オブジェクトをそのまま扱えないし
それにバイナリデータをいじる時たまにunionを扱いたくなるけど一手間なんだよね
2017/09/26(火) 23:20:44.46ID:Ij7a6zSN
プロトコルの多くがテキスト化してきてるから、packは出番が少なくなってるんだよねー
2017/09/28(木) 08:04:49.74ID:o7bSKTAB
Rubyでファイル群を再帰的にパースして抽出したデータを表計算ソフトで編集後に書き戻す
という処理をする場合に表計算ソフトとのインターフェイスを簡単かつスマートに実装できませんかね?
OSはWindows、Linux、FreeBSD。表計算ソフトはExcel、Libre/OpenOffice、Gnumericを想定します

現状はWindows上でSYLKを経由してLibreOfficeで編集しているのですが、Unicode文字をそのまま
扱えなかったり、SYLKのサポートが不完全だったり、編集の終了の検出が難しかったりして面倒です
CSV/TSVでは書式や数式を扱えないですし、ODFでも編集の終了の検出が難しい問題が残ります
2017/09/28(木) 08:41:02.01ID:Lc06qyoR
>>410
Rubyでの内部表現は処理しやすいようにして
表計算ソフトとのデータ受け渡しの際には
CSVに変換するのが普通だと思う
2017/09/28(木) 08:48:24.32ID:7AnfF7EJ
表計算ソフトのファイルを何とかしようというのは筋が悪いよね
データとビューを分離するべき
2017/09/28(木) 12:07:21.55ID:jWw+HTna
>>410
WindowsとExcelに限定してしまって、win 32oleモジュールで処理すれば。
Excelのフル機能にアクセスできるのでは。
2017/09/28(木) 23:24:47.20ID:Rgro2LTl
判りにくくてすみません
現状のRubyスクリプト
 ファイル群をパースして情報を抽出
 SYLKファイルを生成してこれを引数にLibreOffice Calcを起動。スクリプトは待機する
 Calcで情報を編集する。このときにセル参照や簡単な数式等を使用する場合がある
 編集した情報をSYLKファイルに上書き保存してCalcを終了する
 スクリプトが再開しSYLKファイルをパースして情報を取り出す
 ファイル群の情報を更新する
な感じです

>>411
最初はTSVを使っていたのですが>>410に書いた制約等を緩和するために今はSYLKを使用しています

>>412
情報を表形式のUIで編集したいです。これを一から作る大変なので既成の表計算ソフトを使えないかなと考え
今のような形になっています

>>413
Excelはライセンスを1つしか持っていないこともあって滅多に使いません(絶対に使わないわけではない)
415デフォルトの名無しさん
垢版 |
2017/09/29(金) 00:38:00.00ID:KC1uJX1K
表にRubyコードをテキストとしてぶち込んで、
後でRubyからeval
2017/09/29(金) 01:01:10.45ID:c3tXL9dl
MVC の、データ部分だけを処理すべき。
View は、そのアプリ(表計算ソフト)独自の規格だから、無理

結局、View の規格を学ぶことは、
自分で表計算ソフトを作ることになり、車輪の再発明となり、
ビジネスロジックとは無関係のことに、開発費を掛けることになる
2017/09/29(金) 01:16:50.93ID:Zb0/fBQl
CSVで用が済まないならエクセルVBAでやるのが一番妥当だと言う結論に至った
システムにくっついたスクリプト言語がなんだかんだでマシである
2017/09/29(金) 01:30:05.66ID:RLeXl8wr
表計算アプリからの戻りはプロセスを監視するかファイルを監視するかしかない
Windowsの場合はファイルクローズをイベントとして基本的に拾えないので
定期的にポーリングするかファイル変更イベントを監視してチェックする
Linux系で動かしてinotify使うと楽

でも表計算アプリでの編集は手動だろうから
それが終わったらRubyを起動したんでも良くない? 個人用でしょ?
もしそれも面倒なら最低限のマクロを書いてRubyからwatchしやすくするとかかな
2017/09/29(金) 03:05:56.84ID:UluMyDjB
>>414
>Calcで情報を編集する
確認するけどこれは手動だよね?

>Calcを終了する
>スクリプトが再開し
「編集の終了の検出」で再開を自動化したいの?

普通に編集後スクリプトを
手動起動するんじゃダメなの?

商業アプリでも他ソフトで編集してから
再起動させるのは普通だと思うけど

もし表計算と何度も往復して面倒とかだったら
1. VBAを使ってエクセルメインで処理する
2. RubyにGUIをつけて編集可能にする

上記のいずれかを考えるが
表計算のGUIを実装するのは非常に大変なので
1の方が圧倒的に楽だと思う
2017/09/29(金) 05:59:14.07ID:jL38KlQs
表形式のUIで編集したいだけなんだから、GUIはWebブラウザに任せればいいだけじゃん
2017/09/29(金) 06:25:50.08ID:UluMyDjB
Webアプリにすれば連携しやすいが
GUIを実装するのに
JavaScriptが必要になる

JSが使える前提ならアリかもしれないが
やはりエクセルの挙動を再現するのは
ライブラリがあっても大変
2017/09/29(金) 07:29:16.17ID:Vf0Ansyt
require 'win32ole'

ServiceManager = WIN32OLE.new("com.sun.star.ServiceManager")
StarDesktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
doc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, [])
#doc = StarDesktop.loadComponentfromUrl( 'file:///D:/Office/OOO/wrk.ods', '_hidden', 0, [])
sheet = doc.sheets.getByIndex(0)
cell = sheet.getCellByPosition(0, 1)
cell = sheet.getCellRangeByName("A2")
sheet.getCellRangeByName("A1").string = "文字"
sheet.getCellRangeByName("B1").value = 123
sheet.getCellRangeByName("B2").value = 654
sheet.getCellRangeByName("B3").formula = "=B1+B2"
p sheet.getCellRangeByName("A1").type
p sheet.getCellRangeByName("B1").type
2017/09/29(金) 09:07:46.91ID:xJMWYcO3
やった事ないけどリブレオフィスならpythonでマクロ操作できるんじゃないの?
2017/09/29(金) 13:30:50.48ID:K1n6MHEs
ここまでの書き込みを読めばわかるけど
これだけ話がそれるのを見てもわかる通り
物凄く端的に言えば
出来ない
が回答のようだよ
425デフォルトの名無しさん
垢版 |
2017/09/29(金) 13:52:36.88ID:KC1uJX1K
荒らしはうせろ
2017/09/29(金) 17:12:08.47ID:/1pN5XFr
>>423
出来るけど何をしたいの?
2017/09/29(金) 23:02:51.31ID:RLeXl8wr
Windowsで使ったことないけど
起動したプロセスを待ち受けるだけならこれ使ってみれば
https://github.com/enkessler/childprocess
2017/09/30(土) 10:01:17.83ID:TLzEdb0d
来年のExcelを待とう。ttp://jp.techcrunch.com/2017/09/27/20170926microsoft-excel-is-about-to-get-a-lot-smarter/
2017/09/30(土) 11:40:05.80ID:XdOHXaSN
本日14時から
ニコニコ動画などで
Excel方眼紙は悪なのか? その是非を問う公開討論会を生中継
2017/09/30 14:00開始 - ニコニコ生放送
2017/09/30(土) 20:03:10.07ID:auZlLsd0
質問です

ブロックつきで呼び出されたメソッドから、
super をブロックなしで呼び出したいんですが、
どうやればいいんでしょうか?
親クラスに外部イテレータ取得用のメソッドを追加するしかない?

コード例はこんな感じです
ttps://ideone.com/HMVdVD
2017/09/30(土) 20:58:00.31ID:zjhAyoS1
super(&nil)かな。でもeachのEnumeratorだからBのeachが呼ばれるだけだな
432430
垢版 |
2017/09/30(土) 23:06:46.66ID:iQQJc6F+
>>431
method(&nil) って記法があるんですか
知らなかった……

まあ確かに今回の場合はこれではうまくいきませんが、
>>431さんのおかげで解決法は見つかりました
よーするに A#each を呼ぶときにブロックがあればいいわけなので
ttps://ideone.com/706h5s
こんな感じ?
17-18行目と、41行目以降です
433430
垢版 |
2017/09/30(土) 23:09:29.84ID:iQQJc6F+
あっ 違う
ttps://ideone.com/oNjS8J
これでいいんですね
シンプルだしこれで行きたいと思います
どうもありがとうございました
そして sage 忘れ……
434デフォルトの名無しさん
垢版 |
2017/10/01(日) 09:06:54.01ID:haDSEbeL
ジャアアアw
2017/10/01(日) 17:51:05.47ID:YAYz069J
Ruby 4: To Infinity and Beyond // Speaker Deck
https://speakerdeck.com/bbatsov/ruby-4-to-infinity-and-beyond
436デフォルトの名無しさん
垢版 |
2017/10/04(水) 16:19:15.38ID:x/lJJY2U
rubyの人工知能の本、もっと増えないかな
2017/10/05(木) 00:30:39.28ID:rJN31A7T
教えてください。
hash = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
という風に続いている配列から
オレンジの値段を取り出す場合、
どうしたらいいですか?
2017/10/05(木) 01:02:40.96ID:MJCn4tJ3
ハッシュが入ってる配列にふさわしい名前は少なくともhashではないと思う

irb> fruits_data = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
irb> fruits_data.each{|h| p h["price"]}
"100"
"50"
irb> p fruits_data.map{|h| h["price"]}
=> ["100", "50"]
irb> p fruits_data.inject(0){|sum, h| sum += h["price"].to_i}
150

だいたいこんな流れかと
2017/10/05(木) 01:07:26.58ID:MJCn4tJ3
すまん寝ながら書いてて要件満たしてなかった

irb> p fruits_data.find{|h| h["fruits"] == "orange"}
{"fruits"=>"orange", "price"=>"50"}
irb> p fruits_data.find{|h| h["fruits"] == "orange"}["price"]
"50"

文字列が嫌ならto_iでもしとけ
2017/10/05(木) 01:13:05.98ID:sXpkOy/U
>>437
https://ideone.com/qQIM8e
2017/10/05(木) 01:22:25.13ID:PaSIQ/4V
>>437
果物と値段を直接ペアにした方がシンプルになる

answer = ""
fruits_price = {"apple"=>"100","orange"=>"50"}
fruits_price.each do |k,v|
answer = v if k == "orange"
end
p answer #=> 50

書いてたら先を越されてしまった
2017/10/05(木) 01:37:00.79ID:URIOD7FQ
array.find{|i| i[:fruits] == "banana"}&.fetch(:price)


&.[:price]って書ければいいのに。
&.[](:price)は読みにくいからfetchで
2017/10/05(木) 07:56:55.79ID:rJN31A7T
>>438
>>441
>>442
みなさまありがとうございます!
444デフォルトの名無しさん
垢版 |
2017/10/05(木) 22:52:18.95ID:RWFlOlgJ
Effective Ruby の項目10に書いてあるけど、

構造化データを扱う際、Hashの配列よりも、
クラスまたは、Struct(簡易クラス、クラスジェネレータ)のような専用の型を、使った方がいい

data[:name]
キー名のような実装の詳細が、隠蔽されず表に出てくる。
また、存在しないキーは、nilとなる

Person = Struct.new(:name, :address) #定数に代入
data = Person.new("foo", "fugafuga")
data.name

Structでは属性になるから、getter, setter も付いているし、
存在しない属性名でアクセスすると、NoMethodErrorになる
445デフォルトの名無しさん
垢版 |
2017/10/07(土) 15:27:41.53ID:AWMSypLQ
ちまたのRubyハッカソンってどうやって見つけるの?
446デフォルトの名無しさん
垢版 |
2017/10/08(日) 11:34:25.59ID:FYLwhXQv
Rubyの話題っていうか、rspecなんだけどさ、
すごいもやもや感がある。

rspec便利なんだけど、なんで通常のプログラミングとは
ことなった技術を使わないといけないだのだろう?
アサーションとかモックとか

アサーションって要は比較命令だろ?
モックは要はクラスの継承だろ?

もちろんテストのための機能(エラーが起きた時の情報表示)が
ついてるのはわかるよ。でもそれは本質的なことじゃなく
比較命令や継承ができればいいはず。
つまり通常のプログラミング技術と同じ書き方でテストコードも書けるはず。

テストコードが読みやすいようなDSLになっているというのなら
それを通常のプログラミングでも使えばいいやん?読みやすくなる。
なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
2017/10/08(日) 12:00:51.07ID:qef5wK+C
TDD, BDD とか、流行っている

Ruby は、DSL に強いから、常に流行の最先端。
2, 3年遅れて、他の言語に取り入れられる
2017/10/08(日) 12:08:41.89ID:21EEh8/s
BDDを実現するためにあんな「変」な書き方になってる
どうしても性に合わなきゃフツーのユニットテストもあるよ
ただそういう「メソッドの戻り値が妥当かテストするテストの一覧」だけではテストたり得ないという考え方が主流
個人的には好きよ、はみ出ないことを保証する自分向け補正レールとしての大量のユニットテスト群を高速でぐるぐるするやつ
あの時代に戻れたらいいなと思うことはある
2017/10/08(日) 13:05:22.73ID:FYLwhXQv
>>477
Ruby TUEEEEはどうでもいいんだけど、そのレス見てRubyがなまじDSLに
強いからRubyという言語仕様の範囲内(内部DSL)にした結果
通常のプログラミングと異なる技術を使ってしまうんじゃないかって思った
いやちょっと違うかもな。通常のプログラミングで使う内部DSLとテスト用の
内部DSLが異なるという問題かもしれない。DSLといっても内部であればRubyという
言語でしかないので言い回しの違いでしかないかもしれないけど

TDDとかBDDとかshould系とかexpect系とか通常のアサーションとか正直どれもテストとしては
読みづらいと思う。英語としては読みやすいかもしれないけど、テストとしてはということ

どういうことかというと、テスト仕様書ってよくマトリクス(二次元の表)で書くでしょ?
日本語とか英語じゃなくて、マトリクスの形でテスト仕様書書いちゃうんだから
じゃあテストコードもマトリクスであるべきだよ。エクセルの表がまんまテストコードになる感じ
たぶんこの時点でRubyによる内部DSLとして書くのは無理なんじゃないかな
Rubyの表現能力を超えてしまう。無理にやっても読みづらくなる

そしてこのマトリクス。テストコード(定義書?データ?)はエンドユーザーでも
読みやすい(専用のテスト内容ビューワーを作っても良い)と同時にそれが
そのままアプリケーションのコードとして使えればよくね?

テストを書くだけでアプリができるとはいわない。それは不可能。でも減らすことはできる。
エンドユーザーがテストを目視で確認してOKだして、それがそのままアプリで使われれば楽じゃん?
このパラメータには英数字しか使えません。英数字しか入れられないようにチェックコード書きました
英数字しかうけつけないことを証明するテストコード書きました。頑張って英語風にしました。
そこまでやってもエンドユーザーはそれ見て判断できません。これじゃやっぱり無駄に感じる

俺が今話ししてるのはだいたい「定義」の部分なんだよね。「処理」ではない
処理に関してのテストはいままで通りやるしか無いと思うけど
定義に関するテストは(エンドユーザーにもわかりやすい形で)テストコードを書いて
それがそのまま通常のプログラミングのコードとして使えると思うんだよ
モックもクラス「定義」だしね
2017/10/08(日) 14:43:14.66ID:dWIEdLJn
じゃあとりあえず、そのやりかたを例示したら。
現行BDDへの不満はもうわかったので。
2017/10/08(日) 15:14:06.57ID:93IJP3PA
RSpecはテストを構造化しやすいのが良かったが
3からmatcherの文法がクソになったので基本使わない
2017/10/08(日) 17:04:31.77ID:X3i4AnjM
>>446
>なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
それがDSLだから
たとえばHTMLやSQLもRubyやJSとはぜんぜん違うだろ

ただオレは実はMiniTest使ってる
RSpecが大きいフレームワークなので使いこなすの大変

RSpecはRakeやRailsみたいに独自の世界観築いてる
RubyでDSL使った大きめのフレームワークはみんなそう

使いやすいのはメリットだけど
学習コスト大きくなるデメリットもある
まあ個々に選べばいんじゃね?
2017/10/08(日) 17:43:35.10ID:FOJ8Xq1X
>>450
例示は5ちゃんねるとは別の場所でやってる or これからやる
ここではしない。雑多なアイデア?みたいなのを書いて
まあ誰か突っ込んでくれw

モック大嫌いなんだけど、今考えていて気づいたことが有る。
モックって形を変えた引き数なんだな。

テストする時のマトリクスとして考えれば、引数列とは別に
例えばAPI列があってその戻り値が○の場合なんて形で書くと思う
つまりArrange、Act、Assert(AAA)におけるArrange部分だな。

【アンチパターン】Arrange、Act、Assert(AAA)を意識できていないRSpecのコード例とその対処法
https://qiita.com/jnchito/items/91779b55cae0f4915da5

モックを使う使わないに限らず、マトリクス(二次元の表形式)で
テスト仕様書(パターン)は作れると思う

あぁ、そうかrspec等は、このパターンを記述しづらいんだ。
describe、contextなどでパターンを書くことができるけど一覧性がない。
(マトリクスで書きづらいもののために)describe、contextみたいなものはあってもいいけど、
テストパターン(結果含む)とテスト内容はファイルごと分けるべきなんだろうな。

あとモックを使った場合、通常はテストパターンがあればいいと思うんだけど
呼び出し回数や引数テスト(つまりreceive(:hoge).with(引数)).at_least(回数).timesみたいなやつ)
なことをしたいことも有る。単体テストとして考えれば他のモジュール呼び出しだから理解はできるけど
どうみても内部実装に依存したテストだから嫌いだしわかりづらい

こういのはAAAと独立させて、内部実装のテストだって割り切って別に書くべきなんだろう。
マトリクスの表を用意して、引数列、テスト結果列とは別に、内部処理列を作って、
どういった関数が呼び出されるかを書いていく
2017/10/08(日) 17:52:31.79ID:FOJ8Xq1X
たとえば内部処理列に書くテストコードは
マトリックスの1行目を実行した場合、内部処理として

hoge.foo()
hage.bar(1,2,3)
tsuru.baz("aaa")

みたいに縦書きで書いていければいいんじゃないかな?
こういう処理が実行されることって。

あー、そうかrspecだと
Arrangeに相当する部分と
内部実装のテストがごっちゃになってるんだな。
2017/10/08(日) 17:57:45.59ID:FOJ8Xq1X
テスト仕様書ってエクセルがよく使われるけど、
それと同時にエクセルで書くなともいわれる。

ようは表計算としてとして使ってないからなわけだけど、
じゃあ表計算機能をなくしたものを作れば良いんじゃないかな
2017/10/08(日) 18:11:17.54ID:FOJ8Xq1X
ここまではテストパターンをどうやって書くかの話で
rspecでは一覧性がないから適していないという結論で良いんだろう。
これは別ファイルにするということで、describeとcontextとitあたりの
存在は消えたことだろう。

残ってるのはテストパターンではなくテスト内容。
expectとかそこらへん。これがまたRubyの通常のコードと
テストコードで書き方がぜんぜん違うってのが残ってるんだよな。

とここまで書いたが、あれ?テスト結果もマトリクスの
テスト結果列に書き込むよな?

テストコードのためにDSL(expectとか)を覚えなきゃいけないんって
本質的な問題は何なんだ?

テスト結果には、○○が××であること を
○○ == ×× みたいに書けるではないか?
あー、そうか。to be eq みたいに書かないと読みづらい(誰が?)という問題か。

to be eq みたいな構文いらんな。代わりにテストで使える命令のサブセット定義すればいい
そして専用のビューワーを使って見た時は、そのサブセット命令を日本語なりに置き換える。
WISYWIGみたいにどちらで書いても相互反映するのもいいだろう。
2017/10/08(日) 18:37:43.20ID:FOJ8Xq1X
バリデーション部分は実は前からアイデアがあって、

Railsとかこんな感じで書くわけだけど、
https://railsguides.jp/active_record_validations.html

こんなのは一切廃止して、言語非依存の
YAMLとかでバリデーション定義ファイルを作ればいいと思ってる。

そしてモデルでその定義ファイルを参照することもできるし、
APIからも参照することができる。関数からも参照することができる。
言語非依存ということは同じファイルをJavaScriptからも参照できるので
クライアントサイドのバリデーションも同時に定義できる。

ここで俺がいいたいことの1つとして、正規表現をバリデーション定義に
直接書くのはやめようということ。なぜなら技術的な内容過ぎて
エンドユーザーにはわからないから。

正規表現の代わりに独自の関数を使えば事足りる。

複数の条件や現在のデータも考慮しなければいけないものなどは
バリデーション定義ファイルでは実現できないかもしれないけど
重要なのは完璧にすることではなく無駄を減らすこと

またバリデーション定義に似たものとして
権限管理ファイルってのも考えられる。

なるべくエンドユーザーでも直接みれるようにして、
それをそのままプログラムに組み込めるようにしたい
2017/10/08(日) 22:48:32.17ID:ptFQWO2G
>>457
> なぜなら技術的な内容過ぎてエンドユーザーにはわからないから。

え?Railsは技術者が使うものでしょ?
Railsは決して「誰でもWebアプリ書けます」みたいなWAFを目指してるわけじゃないんだし
正規表現すら使えないような技術者に媚びる必要性は一切ないと思うんだけど
459デフォルトの名無しさん
垢版 |
2017/10/09(月) 03:55:05.15ID:YU1H7ndt
厨房って連投しないと死ぬ病気なのか?
2017/10/10(火) 00:12:42.64ID:DgsA/W7P
%bで ASCII_8BITの文字列リテラル作れるようにして
461デフォルトの名無しさん
垢版 |
2017/10/10(火) 01:17:14.00ID:nyY9mfF7
"\xA5もじれつぅ〜〜".bみたいに.bメソッドじゃあ物足りない?
2017/10/10(火) 01:39:18.83ID:DgsA/W7P
frozenが当たり前みたいな風潮があるから
463デフォルトの名無しさん
垢版 |
2017/10/10(火) 02:10:16.84ID:nyY9mfF7
マジかよレイルズ最悪だな

>>462
rubyでfreezeされた・されないを気にし過ぎると頭がハゲるぞ
変更されると本当に困るところだけfreezeしとけばいいんだよ
2017/10/10(火) 02:27:20.63ID:8uFKWlnU
でもruby3からデフォになっちゃうでしょ
2017/10/10(火) 03:22:52.35ID:ACpNi8fa
Freeze化はJava化の始まり
2017/10/10(火) 03:43:43.69ID:FbHCJRcA
文字列をfreezeしない理由なんて無い
関数型プログラミングを勉強しろよ
2017/10/10(火) 12:56:37.76ID:b+0lfNgt
何点か質問させていただいてよろしいでしょうか?

現在「Markdown → HTML 変換をする掲示板」のような CGI を練習がてら作成しています。
変換部を全部自作するのは難しいのではないかと思ったので、既存のライブラリを使用しようと思ったのですが、
種類が多すぎる上、Rails 関係のトピックばかりで検索してもいまいち判断に困ります。
以下の条件を満たす適当なものをご存じでしたらご教示願えませんでしょうか?
 1. GFM 記法対応(シンタックスハイライトは不要)
 2. 使用法は簡単な方が好ましい
 3. 高速であったり多機能であったりする必要はない

同時に、Redcarpet を試しに使ってみようと思ったのですが、
以下のような結果となってしまい正確にインストールできません。原因など分かりますでしょうか?

(本文長すぎと怒られたので次の書き込みに続きます)
2017/10/10(火) 13:17:56.78ID:b+0lfNgt
>>467 の続き)

NG ワードを特定できませんでした……
https://agree.5ch.net/test/read.cgi/mango/1507328607/52
上記書き込みのような結果に終わってしまいます。

他のライブラリを gem 経由でインストールする際には正常に動くのですが、
何が問題だかよろしければご教示ください。
2017/10/10(火) 13:38:26.67ID:laLamLaH
記法が増えるのが好ましくないと言ってしまうと
極端な話、ifとwhileでだいたい済んじゃうんじゃないか

よく使われるから専用の記法を設ける
使いたくないなら使わなければいい
2017/10/10(火) 14:02:36.65ID:8V61cfLq
>>468
理由もエラーも書いてある通りだと思うのだが
詳細なエラーはgem_make.outに書いてある
コンパイラがないか必要な開発用ライブラリがないかどっちかだろうな
稀に手元のgemバージョンがインストールパッケージの想定より新しすぎるというパターンもある
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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