プログラミング言語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/
探検
Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/29(土) 02:01:58.34ID:urVXnFrH
2017/05/01(月) 01:09:37.50ID:U8II69aQ
ruby 2.4.0p0 (2016-12-24 revision 57164) [x64-mswin64_100]
70sec程度 メモリの使用は230MB程度
やっぱりCGのさじ加減?
70sec程度 メモリの使用は230MB程度
やっぱりCGのさじ加減?
2017/05/01(月) 01:13:18.27ID:P+4F2YiV
3938
2017/05/01(月) 01:16:50.69ID:P+4F2YiV すまん、正確には「IOのためのAPI呼び出しのコスト」だな
CPU使用率が仮に100%でもRubyコードそのものの実行時間を測ってるのかどうかは疑わしいよ
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経由で読み込むとか
などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・
IOは足を引っ張っている。最初は処理単位(2Byteや4Byte)で呼んでいて洒落にならないほど遅かった
今は512KB単位で読み込んでいる。25MB程度の場合はreadの呼び出し回数が50回程度の
はずでかなり抑えられているはず
ただしバックグラウンドで読んでいるためにオーバーヘッドは増えている
オンメモリで処理すれば多少速くなるのは確かだろうけど扱うデータ量が多いと数百MBに達する
可能性があることを考えるとあまり現実的はないか
dl経由でCreateFileを叩いてFILE_FLAG_SEQUENTIAL_SCANを付けて開いてWinAPI経由で読み込むとか
などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・
2017/05/01(月) 07:02:53.40ID:lT1GiCV3
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
こういうスクリプト言語なんて自分のぶんの処理が速ければそれでいいのだ
ただし脱中級者認定要件に「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時間の初心者なんでわからん。
具体的なコード教えてくれめんす。
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
49デフォルトの名無しさん
2017/05/01(月) 10:47:11.79ID:lXMk8r4o ありがとうございます。
詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。
関数の集合と適用順番を求める処理が上位にあって。
そこから降ってきたものを具体的に計算したりするときに使いたいのです。
引数の値に対応する関数リストがあるときに関数の適用順序をif文で分岐するとコードが偉いことになるので。
引数に1が来たら関数2,3,5
引数に2が来たら関数3,7,8,12,23
、、、
引数にnが来たら関数1,13を適用
みたいな対応表で、if文で適用関数を区別せず、リストとかで処理を記述したいわけです。
詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。
関数の集合と適用順番を求める処理が上位にあって。
そこから降ってきたものを具体的に計算したりするときに使いたいのです。
引数の値に対応する関数リストがあるときに関数の適用順序を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
単純に引数で処理変えたいなら、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か月くらい早いと思う
それをたとえばデータ配列なんかに持つことは愚行であって(だいいちそのデータだけ見てもなにしてるか読めないし改変追加しんどいだろ)
素直に地の文で論理を記述するべきだろうね
てなわけで被らない分岐をすべて>>50のcaseで分岐させ、メソッドを実行する順番を書いただけの分岐後専用メソッドにぶん投げるのが妥当では
分岐が数十個超あるならクラス作ってファクトリーメソッドとかあのへんに行くんだろうけど1か月くらい早いと思う
2017/05/01(月) 11:23:20.88ID:F35eYYLf
話脱線するけど、上のメソッドにp使うと
p fn(2,10,5)
#=>5
#=>nil
って表示されるけど、何に対してnilを出してるのかが分からん
p fn(2,10,5)
#=>5
#=>nil
って表示されるけど、何に対してnilを出してるのかが分からん
2017/05/01(月) 11:44:56.25ID:hzoMRY/L
>>42
firefox/realplayerの悪口はもっと言え
firefox/realplayerの悪口はもっと言え
2017/05/01(月) 11:53:49.39ID:ZySc29+x
>>52
Rubyのメソッドはすべて戻り値を返す
返すべき適当な値がない場合はnilを返す
んでirbとかはメソッド戻り値も律儀に表示する
irb> def m1; end
irb> m1
=> nil
そいで画面表示するメソッドを使うと標準出力内容とメソッド戻り値が2段表示になる
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 を使えばよい
右に動く関数とか、上に動く関数とかを、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のメソッドにより強い
こういうことならオブジェクト指向について学ぶといい
ただ敵の数が多いとハードコーディングしないでメタプログラミングのがいいかもな
基礎を覚えたら
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は他の使った方が良い
興味ないか……
3dは他の使った方が良い
興味ないか……
2017/05/04(木) 03:22:55.23ID:ufmsKYbO
>>60
基礎を覚えたらと書いてあるだろ
基礎を覚えたらと書いてあるだろ
65デフォルトの名無しさん
2017/05/04(木) 10:08:11.63ID:4jJ2tlWM いま流行りのますとどん
Rubyを学ぼうというインスタンスはないものか
Rubyを学ぼうというインスタンスはないものか
2017/05/04(木) 23:01:56.14ID:TB6ujr0/
rubyの求人が無くて泣く
プログラマになりたいと思って勉強したのに・・・…
これからrubyとrailsの需要が爆発的に伸びるとかってありえますか?
プログラマになりたいと思って勉強したのに・・・…
これからrubyとrailsの需要が爆発的に伸びるとかってありえますか?
2017/05/04(木) 23:38:24.44ID:ufmsKYbO
>>65
立てていいぞ
立てていいぞ
2017/05/04(木) 23:41:48.41ID:ufmsKYbO
2017/05/04(木) 23:44:35.87ID:lRx89izX
RubyもRailsも落ち目で衰退する一方だよ
でも所詮それらは道具であり大して重要なことではない
AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、
実際にサービス作って運用してみるとか
とにかくモノ作れる奴にはいくらでも働き口はある
でも所詮それらは道具であり大して重要なことではない
AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、
実際にサービス作って運用してみるとか
とにかくモノ作れる奴にはいくらでも働き口はある
2017/05/04(木) 23:50:13.53ID:rtRP+bqL
趣味または職業プログラマーとして「生きていく」のにRubyは強力に役立つ
ただし職業プログラマーとして「働く」のにはあまり役に立たない
これはそういうものだ
食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ
ただし職業プログラマーとして「働く」のにはあまり役に立たない
これはそういうものだ
食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ
2017/05/05(金) 00:40:00.34ID:ayKeenIH
それってRuby以外の言語でも言える事じゃね?
というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成
世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・
というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成
世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・
2017/05/05(金) 00:42:47.93ID:YKLEnk0e
ハローワークでも、Pythonの求人は、ほとんどないけど、
Rubyの求人は、たまに見る
Rubyの求人は、たまに見る
2017/05/05(金) 01:01:51.97ID:78DJCXmh
Ruby覚えたら次はJavaでもC#でも飯の種になりそうな言語覚えれば良いじゃん
他の言語について知ると元の言語の理解も深まるから
それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ
他の言語について知ると元の言語の理解も深まるから
それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ
2017/05/05(金) 01:05:47.85ID:TDjvniVu
日本に必要なのは質の高いプログラマーだと思うぞ
世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい
教育面で言えばごくごく一部の大学と大学院を除くと
日本の大学よりCourseraで受けられる講義のほうがレベル高いからな
小学生にプログラミング教育するより高等教育に力入れないと話にならん
あとハローワークは知らんがRubyの求人は普通にあるよ
Rubyで人とるようなところはハロワに出さないだけじゃないの
リクナビとか一般的なサイトで調べてみたら?
世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい
教育面で言えばごくごく一部の大学と大学院を除くと
日本の大学よりCourseraで受けられる講義のほうがレベル高いからな
小学生にプログラミング教育するより高等教育に力入れないと話にならん
あとハローワークは知らんがRubyの求人は普通にあるよ
Rubyで人とるようなところはハロワに出さないだけじゃないの
リクナビとか一般的なサイトで調べてみたら?
2017/05/05(金) 01:44:48.67ID:mu06C9qQ
文法覚えて食えるんだったらせわないわ。
2017/05/05(金) 02:14:13.82ID:iQB12R96
とりあえずRubyで色々作れるなら、他の言語でも文法とライブラリ覚えりゃ作れるでしょ。
ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ?
ソースはおいら。
ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ?
ソースはおいら。
2017/05/05(金) 15:07:31.63ID:K1twnG6D
ねえねえ、Rubyバイナリのバージョン管理って今でもrbenvでいいの?
2017/05/05(金) 19:19:15.08ID:u3v3zIiy
2017/05/05(金) 19:33:23.14ID:78DJCXmh
2017/05/05(金) 19:55:45.07ID:yiYPdEw2
これはdo...endと{}の結合の強さの違いによる問題だね
ここ参照して
http://rurema.clear-code.com/2.4.0/doc/spec=2fcall.html#block
上でも言われてるけどブロック付きメソッドの戻り値をpしたいときは{}使わないと思ったように動かないよ
ここ参照して
http://rurema.clear-code.com/2.4.0/doc/spec=2fcall.html#block
上でも言われてるけどブロック付きメソッドの戻り値をpしたいときは{}使わないと思ったように動かないよ
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
と同じ動きをする。
互換というのは明らかな誤謬。
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: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}
とかって書くのもありだね
(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
下記のスクリプトを走らせると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無知です、わかりません、教えてくださいって酷いゆとりだね
認証に成功してるかどうかもわからないコード使って
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 を付けるって事は、ブロック全体の戻り値を表示する事になる。
ブロック内の各処理の結果じゃない
{ }, do〜end は互換じゃなかったのか!
しかし、ブロックの外側に、p を付ける方が、おかしい!
ブロックの外側に、p を付けるって事は、ブロック全体の戻り値を表示する事になる。
ブロック内の各処理の結果じゃない
2017/05/07(日) 03:25:08.49ID:edBtKeoY
2017/05/07(日) 04:53:57.72ID:cg7edk1d
case文書く時に
case 比較したいオブジェクト名
when 値1 then
文1
って書いてあるけど
別に比較したいオブジェクト名を省略しても動くよね
ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう
case 比較したいオブジェクト名
when 値1 then
文1
って書いてあるけど
別に比較したいオブジェクト名を省略しても動くよね
ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう
2017/05/07(日) 08:48:03.37ID:xlJMQ4jE
>>94
>しかし、ブロックの外側に、p を付ける方が、おかしい!
なるほど、何もしらない初学者だから、こういったこともよくわかっていなかったのです
今後ともよろしくお願いいたします。
今演習をしていますが、
s = "Ruby is an object oriented programming language"
に含まれるアルファベットの頻度をカウントしようとして
s.each_char do |c| で、手がとまっています
>しかし、ブロックの外側に、p を付ける方が、おかしい!
なるほど、何もしらない初学者だから、こういったこともよくわかっていなかったのです
今後ともよろしくお願いいたします。
今演習をしていますが、
s = "Ruby is an object oriented programming language"
に含まれるアルファベットの頻度をカウントしようとして
s.each_char do |c| で、手がとまっています
2017/05/07(日) 10:32:21.91ID:ZvN12MF9
そうですか頑張ってください
100デフォルトの名無しさん
2017/05/07(日) 10:49:01.57ID:yCqO92dr s.chars.uniq.each_with_object({}){|c,h|h[c]=s.count(c)}
101デフォルトの名無しさん
2017/05/07(日) 10:50:54.94ID:yCqO92dr あと別にブロックの外側に、p を付ける事はおかしくない
ブロック全体の戻り値が知りたいときだってあるでしょう
ブロック全体の戻り値が知りたいときだってあるでしょう
102デフォルトの名無しさん
2017/05/07(日) 11:42:11.78ID:cg7edk1d103デフォルトの名無しさん
2017/05/07(日) 14:43:52.81ID:bug3EadL >>98
Rubyに限った話じゃないけどある処理を実装しようとする時は
その処理の入力と出力の型を最初に考えるといいと思うよ
(厳密に定義されてる型じゃなくても別によくて入出力の形式くらいの意味)
例えば
文字列の文字出現頻度をカウントするメソッドの入出力は
string -> hash {“a” => 3, “b” => 5, …}
でeach_charに渡すブロックの入出力は
char -> hash
でcharを1つずつ受け取って意図したhashを返すにはどうするのかを考える
Rubyに限った話じゃないけどある処理を実装しようとする時は
その処理の入力と出力の型を最初に考えるといいと思うよ
(厳密に定義されてる型じゃなくても別によくて入出力の形式くらいの意味)
例えば
文字列の文字出現頻度をカウントするメソッドの入出力は
string -> hash {“a” => 3, “b” => 5, …}
でeach_charに渡すブロックの入出力は
char -> hash
でcharを1つずつ受け取って意図したhashを返すにはどうするのかを考える
104デフォルトの名無しさん
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
入出力の型を考えて、ロジックを考えて、ロジックをコードで表現する方法を見つける
例えば特定の文字が出てくるたびにインクリメントすればいいと考えれば
最初は↓こういう実装でもいい
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
入出力の型を考えて、ロジックを考えて、ロジックをコードで表現する方法を見つける
105デフォルトの名無しさん
2017/05/07(日) 15:19:04.40ID:2pnfBwSz >>104
副作用の意味分かってる?
副作用の意味分かってる?
106デフォルトの名無しさん
2017/05/07(日) 15:42:28.57ID:3+oylOXC 大学すら行ったことのない人は「演習」の意味も分からず>>103-104みたいなことを書くのだ
気をつけようね
気をつけようね
107デフォルトの名無しさん
2017/05/07(日) 16:16:42.30ID:2pnfBwSz reduceは考え方が手続き型に近いので、関数型特有のトップダウンな思考が身についてない人にも馴染みやすいためか、低スキルな人が好んで使うよね
故に>>104のように無自覚に副作用書いちゃう馬鹿野郎も多い
故に>>104のように無自覚に副作用書いちゃう馬鹿野郎も多い
108デフォルトの名無しさん
2017/05/07(日) 18:08:01.01ID:vOdx9BxG ruby の記述力には感動すら感じさせられますね
今回、必要があって ruby を始めましたが、末永くお付き合いさせていただくことになりそうですね、C/C++ だけに眠っていたのは損失でした…
今回、必要があって ruby を始めましたが、末永くお付き合いさせていただくことになりそうですね、C/C++ だけに眠っていたのは損失でした…
110デフォルトの名無しさん
2017/05/07(日) 20:38:50.83ID:YLCveNdh >>108
自己紹介GJ
自己紹介GJ
111デフォルトの名無しさん
2017/05/07(日) 21:06:49.51ID:edBtKeoY >>98
>s.each_char do |c| で、手がとまっています
手が止まるのは、習っていない事をしようとするから。
そりゃ出来ないはず
先に「たのしいRuby 第5版、2016」を3回読めば、ほとんどの事は書いてある
>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)へ
チェーンさせたほうが効率的である
すでに>>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)へ
チェーンさせたほうが効率的である
113デフォルトの名無しさん
2017/05/07(日) 21:47:04.67ID:hR29VPCg >>109
ちゃんと覚えるつもりならRubyの一般的なコーディングルール調べてからのほうがいいよ
自然に do end と {} の使い分けも出来るように考えられてたりとか
無駄な時間を減らせるようになってる
ちゃんと覚えるつもりならRubyの一般的なコーディングルール調べてからのほうがいいよ
自然に do end と {} の使い分けも出来るように考えられてたりとか
無駄な時間を減らせるようになってる
114デフォルトの名無しさん
2017/05/07(日) 22:19:19.16ID:3+oylOXC reduceという別名をつけてくれたのはありがたいことだと思う
厄介な人間の区別がつけやすくなったからな
厄介な人間の区別がつけやすくなったからな
115デフォルトの名無しさん
2017/05/07(日) 22:25:07.52ID:yCqO92dr LISPER大激怒
116デフォルトの名無しさん
2017/05/07(日) 22:28:15.75ID:vQOCcspz enumeratorが効率的なわけがない
117デフォルトの名無しさん
2017/05/07(日) 22:37:40.27ID:3+oylOXC >>115
Rubyのreduceは別にreduceしてるわけではないし
関数型やってるわけでもないのに「わざわざ」reduceと呼ぶのは
・reduceの動作を理解していない
・Rubyと他の関数型言語等との区別をつけられていない
という点で危険人物の可能性が高い
そして実際にそうだったわけであって
Rubyのreduceは別にreduceしてるわけではないし
関数型やってるわけでもないのに「わざわざ」reduceと呼ぶのは
・reduceの動作を理解していない
・Rubyと他の関数型言語等との区別をつけられていない
という点で危険人物の可能性が高い
そして実際にそうだったわけであって
118デフォルトの名無しさん
2017/05/08(月) 00:02:12.04ID:H9Jpde9f >>112
副作用って書いたのはステートメント単位の話ね
each_charとcharsの違いはたかだか知れてるけど
インクリメントのたびに新しいHash作ってたら
100倍・1000倍のオーダーでパフォーマンス変わるよ
副作用って書いたのはステートメント単位の話ね
each_charとcharsの違いはたかだか知れてるけど
インクリメントのたびに新しいHash作ってたら
100倍・1000倍のオーダーでパフォーマンス変わるよ
119デフォルトの名無しさん
2017/05/08(月) 00:17:01.28ID:cPdEWfXE Rubyではほとんどの場合injectだよな
reduceという名前で書きたい処理だと思ったことはRubyではまだないわ
名前重要、は組み込みライブラリにも適用されるのだ
reduceという名前で書きたい処理だと思ったことはRubyではまだないわ
名前重要、は組み込みライブラリにも適用されるのだ
120デフォルトの名無しさん
2017/05/08(月) 01:00:12.59ID:H9Jpde9f パフォーマンス比較
http://ideone.com/coBqfF
http://ideone.com/coBqfF
121デフォルトの名無しさん
2017/05/08(月) 01:16:43.69ID:RkG8OoQA ループはwhile最強のはずと思ったけど、配列や文字列の添字参照は引数のパースにコストがかかるし
何文字目か数えないといけないからeach_charsのほうがマシだな
何文字目か数えないといけないからeach_charsのほうがマシだな
122デフォルトの名無しさん
2017/05/08(月) 05:42:30.32ID:WmCrZwJe effective rubyに倣ってreduceだわ
123デフォルトの名無しさん
2017/05/08(月) 13:18:08.61ID:iGkkPwEU Rubyist Magazine - map と collect、reduce と inject ―― 名前の違いに見る発想の違い
http://magazine.rubyist.net/?0038-MapAndCollect
俺はmap/reduce派
http://magazine.rubyist.net/?0038-MapAndCollect
俺はmap/reduce派
124デフォルトの名無しさん
2017/05/09(火) 00:44:03.70ID:AJpeMRYn >>123
長ったらしいな。
まず、Rubyは他の言語を参考にした。
map と collect、reduce と inject と2つあるのは
Lispを参考にした名前が、mapとrecude、
Smalltaikを参考にした名前が、collectとinjectである。
というだけだろう?
ここまででRubyの話は終わりじゃないか。
長ったらしいな。
まず、Rubyは他の言語を参考にした。
map と collect、reduce と inject と2つあるのは
Lispを参考にした名前が、mapとrecude、
Smalltaikを参考にした名前が、collectとinjectである。
というだけだろう?
ここまででRubyの話は終わりじゃないか。
125デフォルトの名無しさん
2017/05/09(火) 00:44:54.41ID:AJpeMRYn JavaScriptに標準であるのは、mapとrecudeだな。
126デフォルトの名無しさん
2017/05/09(火) 01:55:29.32ID:lu7Bmdm9 配列の関係でお聞きしたいです
http://ideone.com/ntTNm5
こんな感じで任意の文字列を受け取って、それを1文字ずつ分割するっていう動きなのですが
配列を使って繰り返そうとすると上手くいかないです
http://ideone.com/ePxuDp
どうすれば配列に値を返すことが出来るのでしょうか?
http://ideone.com/ntTNm5
こんな感じで任意の文字列を受け取って、それを1文字ずつ分割するっていう動きなのですが
配列を使って繰り返そうとすると上手くいかないです
http://ideone.com/ePxuDp
どうすれば配列に値を返すことが出来るのでしょうか?
127デフォルトの名無しさん
2017/05/09(火) 02:12:04.57ID:7rjXR/HL スクリプトのちぐはぐさから見て、おそらくコピペ継ぎはぎだけで体系的な学習を全くしてないと思われる
書籍のたのしいRubyを買えとまでは言わないので、なんかどっか適当なアフィサイトででも勉強するといいよ
制御構造と変数のスコープについての勉強が足りない
第6章とか第7章とかそのへんまで読破だ
書籍のたのしいRubyを買えとまでは言わないので、なんかどっか適当なアフィサイトででも勉強するといいよ
制御構造と変数のスコープについての勉強が足りない
第6章とか第7章とかそのへんまで読破だ
128デフォルトの名無しさん
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
うまく処理が行われるように変数名を変えたのがポイントであるが眠いので説明はほかの人に譲る
とにかく基礎知識が足りないので焦らずにまずは変数とかそのへんの解説を読むのだよ
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
うまく処理が行われるように変数名を変えたのがポイントであるが眠いので説明はほかの人に譲る
とにかく基礎知識が足りないので焦らずにまずは変数とかそのへんの解説を読むのだよ
129デフォルトの名無しさん
2017/05/09(火) 02:28:47.25ID:7rjXR/HL 追記、1行で書くアホが湧くかもしれないがその人は自分のことしか考えてないので現時点では無視してよい
あなたに必要なのは基礎なのだから
ではお先におやすみなさい
あなたに必要なのは基礎なのだから
ではお先におやすみなさい
130デフォルトの名無しさん
2017/05/09(火) 02:39:10.44ID:lu7Bmdm9131デフォルトの名無しさん
2017/05/09(火) 07:31:40.84ID:k6HrUJzH 違う
ローカル変数やブロック変数の動作を全く理解してないのだ
だから自己代入してバグっても何も思わない
ローカル変数やブロック変数の動作を全く理解してないのだ
だから自己代入してバグっても何も思わない
132デフォルトの名無しさん
2017/05/09(火) 07:34:19.28ID:WySm2t9713387
2017/05/09(火) 20:42:21.42ID:ptoav/qt 結局、会社出入のSIの担当に個人的にお願いしました。
10分で数行追加して解決してくれました。Win10の問題とファイル100ケ問題2点があったとか。
自分で解決するのは無理でしたね。
解決してくれた方には10万くらい謝礼を考えていたのですが、この方には辞退されてしまいましたので
二人で銀座のクラブで豪遊して、逆に初任給相当くらいぶっとばしてしまった・・・
孫の写真をEOS-1D X で撮影した数千枚をぜんぶYAhooBOXにに保管していて、家内に怒られており
苛立ってしまい、お騒がせして申し訳ございませんでした。
10分で数行追加して解決してくれました。Win10の問題とファイル100ケ問題2点があったとか。
自分で解決するのは無理でしたね。
解決してくれた方には10万くらい謝礼を考えていたのですが、この方には辞退されてしまいましたので
二人で銀座のクラブで豪遊して、逆に初任給相当くらいぶっとばしてしまった・・・
孫の写真をEOS-1D X で撮影した数千枚をぜんぶYAhooBOXにに保管していて、家内に怒られており
苛立ってしまい、お騒がせして申し訳ございませんでした。
134デフォルトの名無しさん
2017/05/09(火) 20:45:26.48ID:SmlWSda1 書き込みから頭の悪さが伝わってくるな
135デフォルトの名無しさん
2017/05/09(火) 21:36:06.57ID:V+0O6ahJ 孫もいるのに>>92みたいなこと言うのか……
136デフォルトの名無しさん
2017/05/09(火) 22:04:56.60ID:AJpeMRYn だって娘ってもうおばさんじゃん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★3 [BFU★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★5 [Hitzeschleier★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 政府債務(対GDP比)2025年版発表 ついにあの国がワースト1位になってしまう [884040186]
- 千晴のおちんちん舐めたらめかぶの味がした🤮
- 近所にびっくりドンキーがないんだけど!!!
- 【朗報】高市首相に文春砲を放った文春&新潮、無事に叩かれる
- 高市早苗「長期金利なんかよりも日本が成長することのほうが大事」 [834922174]
- 【悲報】高市「マクロンさあ!近平G7に呼ばずハミゴにしちゃってよ!😡」【小学生内閣】 [359965264]
