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

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

前スレ
Ruby 初心者スレッド Part 59
http://echo.2ch.net/test/read.cgi/tech/1475394638/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
2017/04/30(日) 21:18:20.36ID:V7fCcZ2D
当たり前のことだけど何をやらせるかにも依るでしょ
2017/04/30(日) 23:56:49.84ID:HZc5pT/v
>>33はきっとライブラリの実装がボトルネックになってるんだろうな
2017/05/01(月) 00:37:35.10ID:U8II69aQ
簡易的な計測なので参考程度だけど計ってみた

処理内容
 25MB程度のWaveファイル読みながらフィードバックタイプのエフェクトを掛けてWaveファイルに吐き出す
 読み出しはダブルバッファリング。書き出しは直書き
計測方法
 数回計ってそれっぽい時数を採用
jruby 9.1.8.0 (2.3.1) 2017-03-06 90fc7ab Java HotSpot(TM) Client VM 25.25-b02 on 1.8.0_25-b18 +jit [mswin32-x86]
 65sec程度 メモリの使用は440MB程度
ruby 2.1.2p95 (2014-05-08 revision 45877) [i386-mswin32_100]
 75sec程度 メモリの使用は200MB程度
ruby 2.4.0p0 (2016-12-24 revision 57164) [i386-mswin32_100]
 90sec程度 メモリの使用は130MB程度
インタプリタの起動時間は含まないからJRubyはこれに2〜3秒加算される
jruby 1.7.12だと100秒以上かかっていたからかなり速くなっているけど、CRubyと
比べて劇的に速いってほどじゃないな。速度差はGCのさじ加減のような気も・・・
あと2.4を使ったら速くなるかと思ったら遅くなったw
2017/05/01(月) 01:09:37.50ID:U8II69aQ
ruby 2.4.0p0 (2016-12-24 revision 57164) [x64-mswin64_100]
 70sec程度 メモリの使用は230MB程度
やっぱりCGのさじ加減?
2017/05/01(月) 01:13:18.27ID:P+4F2YiV
>>36
それIOがネックになってないか?
CPU使用率を開示せよ
3938
垢版 |
2017/05/01(月) 01:16:50.69ID:P+4F2YiV
すまん、正確には「IOのためのAPI呼び出しのコスト」だな
CPU使用率が仮に100%でもRubyコードそのものの実行時間を測ってるのかどうかは疑わしいよ
2017/05/01(月) 02:30:50.38ID:fBLf4yNS
メモリ節約と速度は反比例するのは常識だが。。。
2017/05/01(月) 03:01:26.20ID:U8II69aQ
>>38
IOは足を引っ張っている。最初は処理単位(2Byteや4Byte)で呼んでいて洒落にならないほど遅かった
今は512KB単位で読み込んでいる。25MB程度の場合はreadの呼び出し回数が50回程度の
はずでかなり抑えられているはず
ただしバックグラウンドで読んでいるためにオーバーヘッドは増えている

オンメモリで処理すれば多少速くなるのは確かだろうけど扱うデータ量が多いと数百MBに達する
可能性があることを考えるとあまり現実的はないか

dl経由でCreateFileを叩いてFILE_FLAG_SEQUENTIAL_SCANを付けて開いてWinAPI経由で読み込むとか
などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・
2017/05/01(月) 07:02:53.40ID:lT1GiCV3
>>40
そんなことはない
速い言語ではメモリアクセスがボトルネックになることもある
それに、能力の低いプログラマはやたらとメモリを食うプログラムを作る傾向がある
2017/05/01(月) 07:18:13.85ID:fBLf4yNS
画像処理みたいに同じデータにアクセスするコードが少ないか、Rubyインタプリタみたいにループで同じデータ(この場合Rubyコード)にアクセスするコードが多いかの違いだろ。

メモリ確保した割に速くなかったからバランス取ったんじゃねーの?
2017/05/01(月) 08:19:56.73ID:3OyRI7P6
caseでラベルがラベルではなくラベルの文字列としかマッチしないって酷い仕様だな
アリエンティーすぎる
45デフォルトの名無しさん
垢版 |
2017/05/01(月) 08:40:59.02ID:3OyRI7P6
そんなことはなかった
木の生だった
2017/05/01(月) 09:42:14.76ID:B7FMiEuI
Ruby初心者スレ的には使用メモリを気にするのは初心者の証
こういうスクリプト言語なんて自分のぶんの処理が速ければそれでいいのだ
ただし脱中級者認定要件に「Cレベルでのメモリ動作を理解し適宜気にする」という項目があるにはあるがw
47デフォルトの名無しさん
垢版 |
2017/05/01(月) 10:18:46.45ID:lXMk8r4o
def f1(n,r)
n
end
def f3(n,r)
(n+1)%2
end
def f4(n,r)
n%2
end
def f5(n,r)
(n%r)==0?1:0
end
fs=[f1,f1,f3,f4,f5]
fs[3](21,7)
みたいに関数を配列に入れて使いたいんだが触って5時間の初心者なんでわからん。
具体的なコード教えてくれめんす。
2017/05/01(月) 10:34:15.38ID:B7FMiEuI
>>47
技術的には可能ではあるがカレーを箸で食べる方法を工夫するようなものだ
まずは何を食べるときの話なのか教えてくれると最初からスプーンを勧めることができるぞ
49デフォルトの名無しさん
垢版 |
2017/05/01(月) 10:47:11.79ID:lXMk8r4o
ありがとうございます。
詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。

関数の集合と適用順番を求める処理が上位にあって。
そこから降ってきたものを具体的に計算したりするときに使いたいのです。
引数の値に対応する関数リストがあるときに関数の適用順序をif文で分岐するとコードが偉いことになるので。
引数に1が来たら関数2,3,5
引数に2が来たら関数3,7,8,12,23
、、、
引数にnが来たら関数1,13を適用
みたいな対応表で、if文で適用関数を区別せず、リストとかで処理を記述したいわけです。
2017/05/01(月) 11:04:38.77ID:F35eYYLf
>>49
単純に引数で処理変えたいなら、case文で場合分けすればええんで?
def fn(a,b,c)
case a
when a = 1
puts sum = b + c
puts sum = 2*b
when a = 2
puts sum = b - c
when a = 3
puts sum = b * c
when a = "div"
puts sum = b / c
end
end

fn(1,10,5)
#=>15
#=>20
fn(2,10,5)
#=>5
fn(3,10,5)
#=>50
fn("div",10,5)
#=>2
2017/05/01(月) 11:18:46.93ID:ZySc29+x
Ruby始めてすぐなのならどっかででっかい条件分岐させて「実行したいメソッドとその処理順方法」を記した何かを紐づける記述が絶対に必要
それをたとえばデータ配列なんかに持つことは愚行であって(だいいちそのデータだけ見てもなにしてるか読めないし改変追加しんどいだろ)
素直に地の文で論理を記述するべきだろうね

てなわけで被らない分岐をすべて>>50のcaseで分岐させ、メソッドを実行する順番を書いただけの分岐後専用メソッドにぶん投げるのが妥当では
分岐が数十個超あるならクラス作ってファクトリーメソッドとかあのへんに行くんだろうけど1か月くらい早いと思う
2017/05/01(月) 11:23:20.88ID:F35eYYLf
話脱線するけど、上のメソッドにp使うと
p fn(2,10,5)
#=>5
#=>nil
って表示されるけど、何に対してnilを出してるのかが分からん
2017/05/01(月) 11:44:56.25ID:hzoMRY/L
>>42
firefox/realplayerの悪口はもっと言え
2017/05/01(月) 11:53:49.39ID:ZySc29+x
>>52
Rubyのメソッドはすべて戻り値を返す
返すべき適当な値がない場合はnilを返す
んでirbとかはメソッド戻り値も律儀に表示する
irb> def m1; end
irb> m1
=> nil
そいで画面表示するメソッドを使うと標準出力内容とメソッド戻り値が2段表示になる
2017/05/01(月) 11:54:30.99ID:L3YRsyvl
putsの返り値がnilだからでしょ
56デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:54:54.16ID:lXMk8r4o
親切な返答ありがとうございます。
なるほど全然ダメな発想だったのですね私。

将来的な話なのですが、ゲームの雑魚敵を配列に入れた複数の関数で動きや思考や攻撃防御を制御して、
雑魚敵の部位ダメージ量や探索モードや怒りモードなどへの条件を満たすと、配列内の関数を入れ替えることで雑魚敵の挙動を制御したい。
という現時点での目標があります。

とりあえず教えてもらったコードを理解できるか今から頑張ってみます。
2017/05/01(月) 11:56:43.97ID:F35eYYLf
>>54
メソッドの戻り値だったのか、ありがとん
2017/05/01(月) 21:44:37.52ID:+TVy5Krd
ロボットの動きなどは、case文で書く方がまれ。
右に動く関数とか、上に動く関数とかを、Hash か配列に入れておく

キーマップなどもそう。
キー A〜Z に該当する動きを、case文で書くのは大変

呼び出される処理を、ブロックで書く。
ブロックを呼び出すのは、yield

yield(引数)とすると、その引数は、ブロック引数として渡ってくる。
{ |引数| 処理 }
処理が2行以上あるなら、do 〜 end を使えばよい

-> (引数){ 処理 }
lambda{ |引数| 処理 }

Proc.new{ |引数| 処理 }
proc{ |引数| 処理 }

Proc.new, proc では、return が使えないから、->, lambda を使えばよい
2017/05/03(水) 02:23:03.67ID:wSFjLMka
>>56
enemy[0]=Slime.new
enemy[1]=Goblin.new
enemy[1].state=Angry.new
enemy[0].action #普通に弱い
enemy[1].action #Angryのメソッドにより強い

こういうことならオブジェクト指向について学ぶといい
ただ敵の数が多いとハードコーディングしないでメタプログラミングのがいいかもな
基礎を覚えたら
2017/05/03(水) 23:40:20.15ID:zkWNfzXl
スライムとゴブリンを別のクラスにする意味はないだろ
そんなもんデータが違うだけ
2017/05/04(木) 00:17:43.27ID:PMOSX9lZ
普通、スライムとゴブリンは、振る舞い・攻撃パターンが異なるから、
別の基本クラスを継承する

スライムは、無形モンスター。
ゴブリンは、小鬼か妖精族?
62デフォルトの名無しさん
垢版 |
2017/05/04(木) 01:07:10.81ID:kDn7ReiV
ちょっと古い DXRubyの話かと思った
63デフォルトの名無しさん
垢版 |
2017/05/04(木) 01:10:22.16ID:kDn7ReiV
2dのRPGやシューティングは作りやすかったけど
3dは他の使った方が良い

興味ないか……
2017/05/04(木) 03:22:55.23ID:ufmsKYbO
>>60
基礎を覚えたらと書いてあるだろ
65デフォルトの名無しさん
垢版 |
2017/05/04(木) 10:08:11.63ID:4jJ2tlWM
いま流行りのますとどん

Rubyを学ぼうというインスタンスはないものか
2017/05/04(木) 23:01:56.14ID:TB6ujr0/
rubyの求人が無くて泣く
プログラマになりたいと思って勉強したのに・・・…
これからrubyとrailsの需要が爆発的に伸びるとかってありえますか?
2017/05/04(木) 23:38:24.44ID:ufmsKYbO
>>65
立てていいぞ
2017/05/04(木) 23:41:48.41ID:ufmsKYbO
>>66
オブジェクト指向とか別の言語だろうと役に立つ
構文覚えただけならrubyの仕事増えようと役に立たない
それか言語を規定してない仕事でrubyを提案すればいいだろ
2017/05/04(木) 23:44:35.87ID:lRx89izX
RubyもRailsも落ち目で衰退する一方だよ
でも所詮それらは道具であり大して重要なことではない
AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、
実際にサービス作って運用してみるとか
とにかくモノ作れる奴にはいくらでも働き口はある
2017/05/04(木) 23:50:13.53ID:rtRP+bqL
趣味または職業プログラマーとして「生きていく」のにRubyは強力に役立つ
ただし職業プログラマーとして「働く」のにはあまり役に立たない

これはそういうものだ
食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ
2017/05/05(金) 00:40:00.34ID:ayKeenIH
それってRuby以外の言語でも言える事じゃね?

というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成
世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・
2017/05/05(金) 00:42:47.93ID:YKLEnk0e
ハローワークでも、Pythonの求人は、ほとんどないけど、

Rubyの求人は、たまに見る
2017/05/05(金) 01:01:51.97ID:78DJCXmh
Ruby覚えたら次はJavaでもC#でも飯の種になりそうな言語覚えれば良いじゃん
他の言語について知ると元の言語の理解も深まるから
それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ
2017/05/05(金) 01:05:47.85ID:TDjvniVu
日本に必要なのは質の高いプログラマーだと思うぞ
世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい

教育面で言えばごくごく一部の大学と大学院を除くと
日本の大学よりCourseraで受けられる講義のほうがレベル高いからな
小学生にプログラミング教育するより高等教育に力入れないと話にならん

あとハローワークは知らんがRubyの求人は普通にあるよ
Rubyで人とるようなところはハロワに出さないだけじゃないの
リクナビとか一般的なサイトで調べてみたら?
2017/05/05(金) 01:44:48.67ID:mu06C9qQ
文法覚えて食えるんだったらせわないわ。
2017/05/05(金) 02:14:13.82ID:iQB12R96
とりあえずRubyで色々作れるなら、他の言語でも文法とライブラリ覚えりゃ作れるでしょ。
ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ?

ソースはおいら。
2017/05/05(金) 15:07:31.63ID:K1twnG6D
ねえねえ、Rubyバイナリのバージョン管理って今でもrbenvでいいの?
2017/05/05(金) 19:19:15.08ID:u3v3zIiy
https://ideone.com/baTUOX
二乗の和をもとめたいのですが,うまくいきません

https://ideone.com/may0rV
との違いはなんでしょうか?
2017/05/05(金) 19:33:23.14ID:78DJCXmh
>>78
https://ideone.com/zCU275
評価順が違う
戻り値をそのまま使う時は {}
そうでなければ do end が普通かな
2017/05/05(金) 19:55:45.07ID:yiYPdEw2
これはdo...endと{}の結合の強さの違いによる問題だね
ここ参照して
http://rurema.clear-code.com/2.4.0/doc/spec=2fcall.html#block
上でも言われてるけどブロック付きメソッドの戻り値をpしたいときは{}使わないと思ったように動かないよ
2017/05/05(金) 19:56:57.31ID:u3v3zIiy
>>79
コメントありがとうございます.

しかし手元の教科書(たのしいruby)では
obj.method(list) do | ブロック変数|

end



obj.method(list) { | ブロック変数|

}
は互換であると書いてあります.評価順序の違い,とは >>78 のプログラム例では,どのような順序になるから,違う,といえるのでしょうか?
2017/05/05(金) 20:02:27.64ID:yiYPdEw2
例えば
p (1..10).map{|i| i**2}
は(1..10).map{|i| i**2}の戻り値をpするけど
p (1..10).map do |i| i**2 end

p((1..10).map) do |i| i**2 end
と同じ動きをする。
互換というのは明らかな誤謬。
2017/05/05(金) 20:05:43.45ID:u3v3zIiy
>>82
なるほど,よくわかりました
丁寧な回答ありがとうございました
2017/05/05(金) 20:10:13.54ID:yiYPdEw2
ついでに、いちいち書き換えるのが面倒なら
(1..10).map do |i| i**2 end.display
(1..10).map do |i| i**2 end.tap{|e| p e}
とかって書くのもありだね
2017/05/05(金) 20:20:15.00ID:sevG6PSJ
mapをdo end で書くのキモい
2017/05/05(金) 23:25:26.52ID:G0OfeBgr
結合の強さって初めて知ったわ
こんな仕様あったのか
87デフォルトの名無しさん
垢版 |
2017/05/06(土) 14:02:42.85ID:2cSynca3
教えてください。(当方Rubyまったく無知です。)

下記のスクリプトを走らせるとSSLエラーが出るので、
拾ってきた証明書を読ませて何とかしたのですが、
open-uri.rb:359:in `open_http': 403 Forbidden (OpenURI::HTTPError)
と、エラーが出ます。UserAgentや認証やら何かでけられてると思うんですが。
403.1とかのサブエラー返してくれればまだしも原因わからず。

※Yahooボックスから一括DL
ttp://lp6m.hatenablog.com/entry/2016/08/12/184232
2017/05/06(土) 14:25:24.99ID:5w6KEOXn
つまりそのためにYahooのアカウント取ってBOXに何か入れて検証しろと
2017/05/06(土) 18:26:04.98ID:l3lhsLeM
普通に認証失敗してんだろ
認証に成功してるかどうかもわからないコード使って
Ruby無知です、わかりません、教えてくださいって酷いゆとりだね
2017/05/06(土) 18:31:44.81ID:5w6KEOXn
Rubyを学んでいないのならこんな古臭いスクリプトをわざわざRuby入れて使う必要はない
2017/05/06(土) 19:32:19.76ID:s8HixK2i
yahoo box さらうプログラムなら他にもあるよな
92デフォルトの名無しさん
垢版 |
2017/05/06(土) 20:03:38.15ID:2cSynca3
自覚も無い人間の屑共が消えろゴミカス
2017/05/06(土) 20:23:44.39ID:s8HixK2i
私たちはあなたのような人を売るほど見てきてるのですよルンルン
2017/05/07(日) 03:19:50.14ID:edBtKeoY
>>80-84
{ }, do〜end は互換じゃなかったのか!

しかし、ブロックの外側に、p を付ける方が、おかしい!

ブロックの外側に、p を付けるって事は、ブロック全体の戻り値を表示する事になる。
ブロック内の各処理の結果じゃない
2017/05/07(日) 03:25:08.49ID:edBtKeoY
>>87-92
たぶん、Rubyの問題ではない

「403 Forbidden OpenURI::HTTPError」で検索!
2017/05/07(日) 04:53:57.72ID:cg7edk1d
case文書く時に
case 比較したいオブジェクト名
when 値1 then
文1
って書いてあるけど
別に比較したいオブジェクト名を省略しても動くよね
ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう
2017/05/07(日) 08:48:03.37ID:xlJMQ4jE
>>96
caseに値を指定するかどうかでwhenの値の扱いが変わる
特に不思議な仕掛けがある訳じゃなく、単純に文法上別の動作をするってだけのこと
リファレンスにも普通に書いてあるぞ
2017/05/07(日) 10:30:19.21ID:qkFjvNg9
>>94
>しかし、ブロックの外側に、p を付ける方が、おかしい!
なるほど、何もしらない初学者だから、こういったこともよくわかっていなかったのです
今後ともよろしくお願いいたします。

今演習をしていますが、
s = "Ruby is an object oriented programming language"
に含まれるアルファベットの頻度をカウントしようとして
s.each_char do |c| で、手がとまっています
2017/05/07(日) 10:32:21.91ID:ZvN12MF9
そうですか頑張ってください
2017/05/07(日) 10:49:01.57ID:yCqO92dr
s.chars.uniq.each_with_object({}){|c,h|h[c]=s.count(c)}
2017/05/07(日) 10:50:54.94ID:yCqO92dr
あと別にブロックの外側に、p を付ける事はおかしくない
ブロック全体の戻り値が知りたいときだってあるでしょう
2017/05/07(日) 11:42:11.78ID:cg7edk1d
>>97
よく読んだらcase文の最後の所に
省略した場合の挙動が書いてありました・・・・・・申し訳ないです
しかしこれで色々と楽が出来そうです、ありがとうございました
2017/05/07(日) 14:43:52.81ID:bug3EadL
>>98
Rubyに限った話じゃないけどある処理を実装しようとする時は
その処理の入力と出力の型を最初に考えるといいと思うよ
(厳密に定義されてる型じゃなくても別によくて入出力の形式くらいの意味)

例えば
文字列の文字出現頻度をカウントするメソッドの入出力は
string -> hash {“a” => 3, “b” => 5, …}

でeach_charに渡すブロックの入出力は
char -> hash

でcharを1つずつ受け取って意図したhashを返すにはどうするのかを考える
2017/05/07(日) 15:02:27.91ID:bug3EadL
(続き)
例えば特定の文字が出てくるたびにインクリメントすればいいと考えれば
最初は↓こういう実装でもいい

s = "Ruby is an object oriented programming language"
result = Hash.new(0)
s.each_char do |char|
result[char.downcase] += 1
end

上のコードが手続き的で副作用が気持ち悪いと思うようになってくればreduceに変える
s.chars.reduce(Hash.new(0)) {|result, char| result[char.downcase] += 1; result}

reduceだとブロックの最後に明示的にresultを返してやらないといけないのが美しくないと思えばeach_with_objectに変える
s.chars.each_with_object(Hash.new(0)) {|char, result| result[char.downcase] += 1}

文字の集合をgroup byすればいいというふうに考えれば↓こういう感じとか(パフォーマンスは上のほうがよいけど)
s.chars.group_by{|char| char.downcase}
.map{|key, value| [key, value.length]}
.to_h

入出力の型を考えて、ロジックを考えて、ロジックをコードで表現する方法を見つける
2017/05/07(日) 15:19:04.40ID:2pnfBwSz
>>104
副作用の意味分かってる?
2017/05/07(日) 15:42:28.57ID:3+oylOXC
大学すら行ったことのない人は「演習」の意味も分からず>>103-104みたいなことを書くのだ
気をつけようね
2017/05/07(日) 16:16:42.30ID:2pnfBwSz
reduceは考え方が手続き型に近いので、関数型特有のトップダウンな思考が身についてない人にも馴染みやすいためか、低スキルな人が好んで使うよね
故に>>104のように無自覚に副作用書いちゃう馬鹿野郎も多い
2017/05/07(日) 18:08:01.01ID:vOdx9BxG
ここでネタ書いてる人がいる.

http://jbpress.ismedia.jp/articles/-/49927?page=3
2017/05/07(日) 18:18:09.31ID:qkFjvNg9
ruby の記述力には感動すら感じさせられますね
今回、必要があって ruby を始めましたが、末永くお付き合いさせていただくことになりそうですね、C/C++ だけに眠っていたのは損失でした…
2017/05/07(日) 20:38:50.83ID:YLCveNdh
>>108
自己紹介GJ
111デフォルトの名無しさん
垢版 |
2017/05/07(日) 21:06:49.51ID:edBtKeoY
>>98
>s.each_char do |c| で、手がとまっています

手が止まるのは、習っていない事をしようとするから。
そりゃ出来ないはず

先に「たのしいRuby 第5版、2016」を3回読めば、ほとんどの事は書いてある
112デフォルトの名無しさん
垢版 |
2017/05/07(日) 21:36:25.47ID:vOfy+8Oj
>>104
すでに>>105が指摘しているけど、破壊的代入は副作用の一つだよ

副作用の無い「関数型プログラミング」と呼ばれる作法に従えば、
以下のコードになる

http://ideone.com/d48CGm

詳しくは以下の文書を参照
・Rubyによる関数型プログラミング
 http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html

あと蛇足を加えると:
・上記のコードでは、reduce ではなく inject を用いた
・効率という視点では破壊的代入を用いる>>104のコードのほうが優れている
・わざわざメソッド String#chars で文字列を文字の配列に展開するよりも、
 ブロックを伴わないメソッド String#each_char は列挙オブジェクト
 (enumerator)を返すから、それを直接inject(あるいは reduce)へ
 チェーンさせたほうが効率的である
2017/05/07(日) 21:47:04.67ID:hR29VPCg
>>109
ちゃんと覚えるつもりならRubyの一般的なコーディングルール調べてからのほうがいいよ
自然に do end と {} の使い分けも出来るように考えられてたりとか
無駄な時間を減らせるようになってる
2017/05/07(日) 22:19:19.16ID:3+oylOXC
reduceという別名をつけてくれたのはありがたいことだと思う
厄介な人間の区別がつけやすくなったからな
2017/05/07(日) 22:25:07.52ID:yCqO92dr
LISPER大激怒
2017/05/07(日) 22:28:15.75ID:vQOCcspz
enumeratorが効率的なわけがない
2017/05/07(日) 22:37:40.27ID:3+oylOXC
>>115
Rubyのreduceは別にreduceしてるわけではないし
関数型やってるわけでもないのに「わざわざ」reduceと呼ぶのは
・reduceの動作を理解していない
・Rubyと他の関数型言語等との区別をつけられていない
という点で危険人物の可能性が高い
そして実際にそうだったわけであって
2017/05/08(月) 00:02:12.04ID:H9Jpde9f
>>112
副作用って書いたのはステートメント単位の話ね

each_charとcharsの違いはたかだか知れてるけど
インクリメントのたびに新しいHash作ってたら
100倍・1000倍のオーダーでパフォーマンス変わるよ
2017/05/08(月) 00:17:01.28ID:cPdEWfXE
Rubyではほとんどの場合injectだよな
reduceという名前で書きたい処理だと思ったことはRubyではまだないわ
名前重要、は組み込みライブラリにも適用されるのだ
2017/05/08(月) 01:00:12.59ID:H9Jpde9f
パフォーマンス比較
http://ideone.com/coBqfF
2017/05/08(月) 01:16:43.69ID:RkG8OoQA
ループはwhile最強のはずと思ったけど、配列や文字列の添字参照は引数のパースにコストがかかるし
何文字目か数えないといけないからeach_charsのほうがマシだな
2017/05/08(月) 05:42:30.32ID:WmCrZwJe
effective rubyに倣ってreduceだわ
2017/05/08(月) 13:18:08.61ID:iGkkPwEU
Rubyist Magazine - map と collect、reduce と inject ―― 名前の違いに見る発想の違い
http://magazine.rubyist.net/?0038-MapAndCollect

俺はmap/reduce派
2017/05/09(火) 00:44:03.70ID:AJpeMRYn
>>123
長ったらしいな。

まず、Rubyは他の言語を参考にした。
map と collect、reduce と inject と2つあるのは
Lispを参考にした名前が、mapとrecude、
Smalltaikを参考にした名前が、collectとinjectである。
というだけだろう?
ここまででRubyの話は終わりじゃないか。
2017/05/09(火) 00:44:54.41ID:AJpeMRYn
JavaScriptに標準であるのは、mapとrecudeだな。
2017/05/09(火) 01:55:29.32ID:lu7Bmdm9
配列の関係でお聞きしたいです
http://ideone.com/ntTNm5
こんな感じで任意の文字列を受け取って、それを1文字ずつ分割するっていう動きなのですが

配列を使って繰り返そうとすると上手くいかないです
http://ideone.com/ePxuDp

どうすれば配列に値を返すことが出来るのでしょうか?
2017/05/09(火) 02:12:04.57ID:7rjXR/HL
スクリプトのちぐはぐさから見て、おそらくコピペ継ぎはぎだけで体系的な学習を全くしてないと思われる
書籍のたのしいRubyを買えとまでは言わないので、なんかどっか適当なアフィサイトででも勉強するといいよ
制御構造と変数のスコープについての勉強が足りない
第6章とか第7章とかそのへんまで読破だ
2017/05/09(火) 02:21:33.84ID:7rjXR/HL
最初のスクリプト修正
input = gets.chomp
s1,s2,s3 = input.split(" ")

a = s1.split(//)
b = s2.split(//)
c = s3.split(//)

p a,b,c

次のやつの例
input = gets.chomp
arr = input.split(" ")

result = []
arr.each do |s|
result << s.split(//)
end

result.each do |e|
p e
end

うまく処理が行われるように変数名を変えたのがポイントであるが眠いので説明はほかの人に譲る
とにかく基礎知識が足りないので焦らずにまずは変数とかそのへんの解説を読むのだよ
2017/05/09(火) 02:28:47.25ID:7rjXR/HL
追記、1行で書くアホが湧くかもしれないがその人は自分のことしか考えてないので現時点では無視してよい
あなたに必要なのは基礎なのだから
ではお先におやすみなさい
2017/05/09(火) 02:39:10.44ID:lu7Bmdm9
>>128
あ、新しく空の配列作っておいて
繰り返しの時に、分割した結果をその中に入れるっていう処理にすれば良かったんですね
ありがとうございました!
2017/05/09(火) 07:31:40.84ID:k6HrUJzH
違う
ローカル変数やブロック変数の動作を全く理解してないのだ
だから自己代入してバグっても何も思わない
2017/05/09(火) 07:34:19.28ID:WySm2t97
>>131
あー、確かにその辺は凄い曖昧ですね・・・・・・
もう一回その周辺含めて勉強し直します
13387
垢版 |
2017/05/09(火) 20:42:21.42ID:ptoav/qt
結局、会社出入のSIの担当に個人的にお願いしました。
10分で数行追加して解決してくれました。Win10の問題とファイル100ケ問題2点があったとか。
自分で解決するのは無理でしたね。

解決してくれた方には10万くらい謝礼を考えていたのですが、この方には辞退されてしまいましたので
二人で銀座のクラブで豪遊して、逆に初任給相当くらいぶっとばしてしまった・・・
孫の写真をEOS-1D X で撮影した数千枚をぜんぶYAhooBOXにに保管していて、家内に怒られており
苛立ってしまい、お騒がせして申し訳ございませんでした。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。