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/08/25(金) 16:05:20.69ID:0nrK3Ckt
大規模障害記念
2017/08/25(金) 16:05:48.85ID:HsL9LVKJ
たのしいRuby 第5版、2016

Effective Ruby、2015

メタプログラミング Ruby 第2版、2015

Rubyのしくみ、2014

改訂3版 基礎 Ruby on Rails、黒田努・佐藤和人、2015

リファクタリング:Rubyエディション、2010
2017/08/25(金) 16:10:23.56ID:HsL9LVKJ
ギリセーフで間に合った
2017/08/25(金) 16:11:37.65ID:sLUvaIRs
前スレ>>997,999
ありがとうございます。

自分のレベル的に997の方しか理解できていませんが、
999の方もがんばって読み解いてみます。
6デフォルトの名無しさん
垢版 |
2017/08/25(金) 16:12:33.08ID:BwHFndLq
each_with_object
なんて初めて見た。


a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]

b = a.each_with_object([[],[]]) {|(x, y), acc| acc[0] << x; acc[1] << (y || x) }
p b # => [[1, 3, 4, 5, 6, 8, 9, 11, 13], [2, 3, 4, 5, 7, 8, 10, 12, 14]]
7デフォルトの名無しさん
垢版 |
2017/08/25(金) 16:18:41.59ID:BwHFndLq
evens = (1..10).each_with_object([]) {|i, a| a << i*2 }
# => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

each_with_objectってのは引数一個(空の配列)とブロックを取るみたい。
ブロックには、引数が2つ渡り、最初は、列挙される要素、2番目は引数(空の配列)が渡るらしい。

ブロックの戻値がeach_with_objectの戻値かな?
8デフォルトの名無しさん
垢版 |
2017/08/25(金) 16:25:39.04ID:BwHFndLq
a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
p a

a.each{|(x, y)| puts "x = " + x.to_s + "y = " + y.to_s}

このtupleみたいな(x, y)ってのは何だ?
Rubyにtupleがあるのか?
2017/08/25(金) 16:26:35.62ID:4MOWRfGQ
ブロック中での最後の評価値、じゃないのがこれの使い易いところ
戻り値には、each_with_object(ここのオブジェクト)を返す

injectでやろうとして
b = a.inject([[],[]]) {|acc, (x, y)| acc[0] << x; acc[1] << (y || x); acc}
ブロックの最後でこうやってaccを返そうとして頑張っちゃうような時には考えたい
10デフォルトの名無しさん
垢版 |
2017/08/25(金) 16:30:33.90ID:BwHFndLq
よく判らんが、要素2個の配列をブロックの引数で(x, y)って受け取れば、
2個の要素はx,yとして受け取れるらしい。
11前スレ996
垢版 |
2017/08/25(金) 16:55:24.12ID:sLUvaIRs
aの配列の個数が変わる場合があるので、とりあえず以下のようにしてみたのですがrslt1とrslt2で結果が異なるのは何故ですか?
tobj==[[],[]]はtrueと出ます。

a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
tobj=[[]]*2
rslt1 = a.each_with_object([[],[]]) {|x,tary|; tary.each_with_index{|n,i| x.instance_of?(Array) ? tary[i]<<x[i] : tary[i]<<x}}
rslt2 = a.each_with_object(tobj) {|x,tary|; tary.each_with_index{|n,i| x.instance_of?(Array) ? tary[i]<<x[i] : tary[i]<<x}}
12前スレ996
垢版 |
2017/08/25(金) 17:00:35.79ID:sLUvaIRs
すみません。上のは不要なセミコロンが入っていました。(動作は問題ないみたいですが)

a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
tobj=[[]]*2
rslt1 = a.each_with_object([[],[]]) {|x,tary| tary.each_with_index{|n,i| x.instance_of?(Array) ? tary[i]<<x[i] : tary[i]<<x}}
rslt2 = a.each_with_object(tobj) {|x,tary| tary.each_with_index{|n,i| x.instance_of?(Array) ? tary[i]<<x[i] : tary[i]<<x}}
p rslt1,rslt2
2017/08/25(金) 17:06:01.66ID:W3qddKKH
Rubyの初め方

ルビィの冒険

たのしいRuby、初めてのRuby

パーフェクトRuby

Rubyベストプラクティス
EffectiveRuby
メタプログラミングRuby1版or2版
Rubyによるデザインパターン

リファクタリングRubyエディション
Rubyのしくみ。

ウェブアプリ方面
パーフェクトRubyonRails
RubyonRails5アプリケーション・プログラミング
Docker教科書
JapaScript本格入門第二版
入門Git
GitHub実践入門
SQL 第2版 ゼロからはじめるデータベース操作
達人に学ぶ SQL徹底指南書
SQLアンチパターン
14デフォルトの名無しさん
垢版 |
2017/08/25(金) 17:51:40.95ID:HsL9LVKJ
リファクタリングRubyエディション
Rubyのしくみ

このふたつは必読
2017/08/25(金) 18:32:17.61ID:w/d6Mddl
>>前スレ989
それ継承でなくて上書きがダメって言ってるだけじゃん
Objectクラス継承しちゃうんだからもうオブジェクト指向言語使うのやめなよ
2017/08/25(金) 18:48:50.81ID:W3qddKKH
>>13
最初からwebアプリ(Rails)を作りたい人は
ルビィの冒険

たのしいRuby、初めてのRuby

パーフェクトRuby

パーフェクトRubyonRails
達人に学ぶ SQL徹底指南書
達人に学ぶ DB設計徹底指南書
SQLアンチパターン

テスト駆動開発をやりたい人は
Railsチュートリアル
はじめて学ぶソフトウェアテスト技法
Everyday Rails - RSpecによるRailsテスト入門
2017/08/25(金) 19:18:38.80ID:3NyVHrhs
>>12
そりゃあんた2次元配列の初期化の基本でしょ。
tobj[0].object_id == tobj[1].object_id なんだから。
tobj = Array.new(2).map([]) とでもしないと。
2017/08/25(金) 19:25:54.88ID:3NyVHrhs
>>10
x, y = [1, 2]
# x = 1; y = 2

x, y = 3
# x = 3; y = nil
を考えれてみれば分かる。
2017/08/25(金) 19:27:54.09ID:UfR6nGBm
Rubyに多次元配列は存在しない
とかいう例のアレにも通じるアレだな

Array#*は単純にレシーバを引数回繰り返した結果を返す(値は複製しない)
複製しないってことは同じ配列がいくつも繰り返されるだけだ
つまり [[]]*2 と [[],[]] は違う
2017/08/25(金) 20:37:35.28ID:rKeka8MH
a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
a.map {|e| [[e].flatten[0], [e].flatten[-1]] }.transpose
=> [[1, 3, 4, 5, 6, 8, 9, 11, 13], [2, 3, 4, 5, 7, 8, 10, 12, 14]]
21デフォルトの名無しさん
垢版 |
2017/08/25(金) 21:01:41.73ID:rKeka8MH
[a.map {|(e)| e }, a.map {|(*,e)| e }]
=> [[1, 3, 4, 5, 6, 8, 9, 11, 13], [2, 3, 4, 5, 7, 8, 10, 12, 14]]
2017/08/25(金) 21:09:45.04ID:rKeka8MH
[a.map {|(e,*)| e }, a.map {|(*,e)| e }]
=> [[1, 3, 4, 5, 6, 8, 9, 11, 13], [2, 3, 4, 5, 7, 8, 10, 12, 14]]
こっちのほうがきれい >>21は撤回で
2017/08/25(金) 21:31:15.78ID:SZeQgZta
カッコ要らないよ
[a.map {|e,*| e }, a.map {|*,e| e }]
2017/08/25(金) 21:58:40.29ID:rKeka8MH
>>23
恐縮です
2017/08/25(金) 22:46:54.39ID:teISJdbp
>>10
メソッドやブロックの引数の受け取り方は多重代入と似た挙動になってるから
入れ子になった配列も展開して変数に受け取ることもできる

def test(a, (b, (c, d)))
 ……
end

test 1, [2, [3, 4]]
2017/08/25(金) 22:56:33.15ID:UfR6nGBm
コードゴルフ(もどき)はあまり好ましいことではないように思える
初心者スレであるから特に
splat*を書いてしまったら立ち止まるべきかと
2017/08/26(土) 00:10:52.42ID:azDqTcfP
>>10
Destructuringだね

多重代入は括弧により、ネストした配列の要素を代入することもできます。
https://docs.ruby-lang.org/ja/2.4.0/doc/spec=2foperator.html#multiassign
http://tony.pitluga.com/2011/08/08/destructuring-with-ruby.html
2017/08/26(土) 00:16:16.83ID:Q9D9720h
うむ
尤もだ
29デフォルトの名無しさん
垢版 |
2017/08/26(土) 00:18:15.51ID:6TCzEPsc
>>26
好ましくないが、楽しいので初心者向き。
30デフォルトの名無しさん
垢版 |
2017/08/26(土) 00:23:16.07ID:6TCzEPsc
>>18
うぅーん。よく判らん。
Rubyの多重代入が、ブロック引数にも使えるって事なのか?
2017/08/26(土) 00:30:44.39ID:Q9D9720h
>>27
上のリンク先の多重代入の説明間違ってるな
2017/08/26(土) 00:31:33.66ID:GUwpgiyr
カンマで区切る代入はRubyの魔境のひとつなので半端に深入りするのも半端に慣れるのも事故のもとだからやめといたほうがいいかも
33デフォルトの名無しさん
垢版 |
2017/08/26(土) 01:28:41.95ID:8HsFh7FA
多重代入でもハッシュが使えればなーって思うことがたまにある

(x:, y: 1, z: 1.5) = { x: -1 }
2017/08/26(土) 01:33:58.36ID:N4fvc+FV
式の評価の順番がわけわかめになるのでやめちくり><
2017/08/26(土) 01:44:30.12ID:azDqTcfP
>>33
それはHash#mergeじゃいかんの?

hash = {x:nil, y:1, z:1.5}
hash.merge x:-1
=> {:x=>-1, :y=>1, :z=>1.5}
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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