Ruby 初心者スレッド Part 61 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語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/ たのしいRuby 第5版、2016
Effective Ruby、2015
メタプログラミング Ruby 第2版、2015
Rubyのしくみ、2014
改訂3版 基礎 Ruby on Rails、黒田努・佐藤和人、2015
リファクタリング:Rubyエディション、2010 前スレ>>997,999
ありがとうございます。
自分のレベル的に997の方しか理解できていませんが、
999の方もがんばって読み解いてみます。 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]] 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の戻値かな? 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があるのか? ブロック中での最後の評価値、じゃないのがこれの使い易いところ
戻り値には、each_with_object(ここのオブジェクト)を返す
injectでやろうとして
b = a.inject([[],[]]) {|acc, (x, y)| acc[0] << x; acc[1] << (y || x); acc}
ブロックの最後でこうやってaccを返そうとして頑張っちゃうような時には考えたい よく判らんが、要素2個の配列をブロックの引数で(x, y)って受け取れば、
2個の要素はx,yとして受け取れるらしい。 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}} すみません。上のは不要なセミコロンが入っていました。(動作は問題ないみたいですが)
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 Rubyの初め方
ルビィの冒険
↓
たのしいRuby、初めてのRuby
↓
パーフェクトRuby
↓
Rubyベストプラクティス
EffectiveRuby
メタプログラミングRuby1版or2版
Rubyによるデザインパターン
↓
リファクタリングRubyエディション
Rubyのしくみ。
ウェブアプリ方面
パーフェクトRubyonRails
RubyonRails5アプリケーション・プログラミング
Docker教科書
JapaScript本格入門第二版
入門Git
GitHub実践入門
SQL 第2版 ゼロからはじめるデータベース操作
達人に学ぶ SQL徹底指南書
SQLアンチパターン リファクタリングRubyエディション
Rubyのしくみ
このふたつは必読 >>前スレ989
それ継承でなくて上書きがダメって言ってるだけじゃん
Objectクラス継承しちゃうんだからもうオブジェクト指向言語使うのやめなよ >>13
最初からwebアプリ(Rails)を作りたい人は
ルビィの冒険
↓
たのしいRuby、初めてのRuby
↓
パーフェクトRuby
↓
パーフェクトRubyonRails
達人に学ぶ SQL徹底指南書
達人に学ぶ DB設計徹底指南書
SQLアンチパターン
テスト駆動開発をやりたい人は
Railsチュートリアル
はじめて学ぶソフトウェアテスト技法
Everyday Rails - RSpecによるRailsテスト入門 >>12
そりゃあんた2次元配列の初期化の基本でしょ。
tobj[0].object_id == tobj[1].object_id なんだから。
tobj = Array.new(2).map([]) とでもしないと。 >>10
x, y = [1, 2]
# x = 1; y = 2
や
x, y = 3
# x = 3; y = nil
を考えれてみれば分かる。 Rubyに多次元配列は存在しない
とかいう例のアレにも通じるアレだな
Array#*は単純にレシーバを引数回繰り返した結果を返す(値は複製しない)
複製しないってことは同じ配列がいくつも繰り返されるだけだ
つまり [[]]*2 と [[],[]] は違う 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]] [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]] [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は撤回で カッコ要らないよ
[a.map {|e,*| e }, a.map {|*,e| e }] >>10
メソッドやブロックの引数の受け取り方は多重代入と似た挙動になってるから
入れ子になった配列も展開して変数に受け取ることもできる
def test(a, (b, (c, d)))
……
end
test 1, [2, [3, 4]] コードゴルフ(もどき)はあまり好ましいことではないように思える
初心者スレであるから特に
splat*を書いてしまったら立ち止まるべきかと >>18
うぅーん。よく判らん。
Rubyの多重代入が、ブロック引数にも使えるって事なのか? >>27
上のリンク先の多重代入の説明間違ってるな カンマで区切る代入はRubyの魔境のひとつなので半端に深入りするのも半端に慣れるのも事故のもとだからやめといたほうがいいかも 多重代入でもハッシュが使えればなーって思うことがたまにある
(x:, y: 1, z: 1.5) = { x: -1 } 式の評価の順番がわけわかめになるのでやめちくり>< >>33
それはHash#mergeじゃいかんの?
hash = {x:nil, y:1, z:1.5}
hash.merge x:-1
=> {:x=>-1, :y=>1, :z=>1.5} >>32
ホントだ。魔境だ。変な仕様だ。
多重代入は括弧により、ネストした配列の要素を代入することもできます。
(foo, bar), baz = [1, 2], 3 # foo = 1; bar = 2; baz = 3 そういえばMatz自身が魔境だと言う動画を見たことある。
Matz 多重代入 で検索。
$変数も魔境だ。C言語の関数ポインタの宣言の読み方も魔境だ。
SwiftのStringも魔境だ。
おっと、失礼! 多重代入、trickyすぎる。
files = ['Gemfile', 'LICENSE.txt', 'README.md', 'Rakefile', 'bin', 'lib', 'maliq.gemspec', 'pkg', 'spec']
多重代入+括弧で解決します。
(gemspec, *_), files = files.partition { |f| f.match(/¥.gemspec$/) }
gemspec # => "maliq.gemspec"
files # => ["Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin", "lib", "pkg", "spec"] >>35
それだとその後に
x, y, z = hash[:x], hash[:y], hash[:z]
ってやるか
x, y, z = hash.values_at(:x, :y, :z)
ってやった上に必須キー・不正なキーの確認処理が必要になるじゃない
((x1:, y1:, color1: 0xffffffff), (x2:, y2:, color2: 0x00ffffff)) = obj
みたいに配列中のハッシュも多重代入で済ませられたらなってのが動機
……新しい魔境ができそう 長年の謎だったがアスタリスクのことをスプラットとも言うのか いやアスタリスクはアスタリスクだよ
引数展開をsplatと呼ぶ
それに使われるときの演算子だからsplat >>40
うん、すまんが何を実現したいか理解できんかった >>41
splat = ビシャ
スプラトゥーンってゲーム流行ってるらしいけど、俺は興味無い。 >>32,36
魔境?、よくわからんけど ML や Haskell といったモダンな関数型言語にある
タプルのパターンマッチングをRubyが部分的に導入した(パクった)だけでは?
たとえば SML(Standard ML) だと、以下は魔境でも魔術でもなんでもなく
単なるパターンマッチングの初歩でしかない
- val ((x, y), z) = ((1, 2), 3); (* 先頭の ‘-‘ はSML/NJのプロンプト *)
val x = 1 : int (* 以下はSML/NJ の応答 *)
val y = 2 : int
val z = 3 : int
少なくとも、これをSMLの世界で魔境やら多重代入と呼ぶ人は存在しない
君たちを見ていると、何やら未開の土人がテレビという文明に接して、
それを魔境の道具などと謎に満ちた深淵な事象に認識してしまう映像を思い出す ただの変数リテラル代入を魔境と呼んでる人はいないと思う Prologなんか言語自体が
パターンマッチングで動作してて
全部魔境だからな >>46
モダンな関数型言語のパターンマッチングが単なる変数への代入に限定されると
思い込んでるってことは、君も彼らと同じく未開の土人なんだろな
そんなのネットで調べればすぐにわかることなのに気の毒な >>47
Prolog だと>>45の例は以下のようになる
?- ((X, Y), Z) = ((1, 2), 3). % 先頭の ‘?-‘ は SWI-Prolog のプロンプト
X = 1, % 以下は SWI-Prolog の応答
Y = 2,
Z = 3.
なお ML や Haskell といった関数型言語(および Ruby)のパターンマッチングは
変数と値の代入に限定されるけど、Prolog では変数と変数のマッチも許容され、
それを単一化(ユニフィケーション)と呼び、論理型言語の特質の一つになっている
まあそれを魔境と捉えるのはその人しだいだし、確かに初対面では魔境にしか
見えないのも仕方ないのかもしれない
でも自分にとっては、Lisp の caadr やら cadar やらに嫌気がさしていたから、
なんて(人に)優しい構文なんだと Prolog に入れ込む理由の
大きな要因の一つになっていた
同じく、Ruby のケースも導入されたのは 1.8 の頃だと思うけど、
自分はそれを肯定的に捉えている パターンマッチングを参考に取り入れたはいいけど、つまみ食い的に取り入れたために
きちんとした仕様を策定できなくて魔境になっちゃった
…という感じでは? >>45
パターンマッチングと多重代入は別もの
destructuringとかunpackingする部分が共通してるだけ
MLはしらんけどHaskell含めて関数型言語には
基本的に多重代入って考え方がないからそう呼ばないだけだと思うよ >>50
上でもちらっと言われてるがただの変数代入なら複雑ではない
片方がメソッドの評価であるような場合何が何やらわからなくなる >>51
スレに要らない人間だってあれだけ言われたのにね
脳の壊れた人間は厄介ですよ 魔境ってのも、仕様的魔境なのか、実装的魔境なのか、その辺があいまいだよねー >>49
えーと、つまり代入の左右の扱いが等価って事?
何持ってこようとお構いなし? >>53
どうやら >>46 のお仲間みたいですね、しかたないから具体的なコードで
Ruby の場合:
$ irb
irb(main):001:0> [[1,2], [3, 4], [5, 6]].map { |(x, y)| x + y }
=> [3, 7, 11]
SMLの場合:
$ sml
Standard ML of New Jersey v110.79 [built: Sun Oct 4 14:45:06 2015]
- map (fn (x, y) => x + y) [(1, 2), (3, 4), (5, 6)];
val it = [3,7,11] : int list
Ruby のメソッド Enumerable#map の引数であるブロックに相当する
SML の構文 が “fn” <pat> => <expr> になる
>>45 の代入の構文は “val” <pat> = <expr> でしかない
さらに具体的なコードをお求めなら、以下を読んで:
関数型プログラミングにおけるクイックソート・アルゴリズムの実装
http://www.h6.dion.ne.jp/~machan/misc/qsort-in-fp.html >>56
直感的に言えば、単一化の概念はそれで合ってる(左辺と右辺を同等に扱う)
そして Prolog に代表される論理型言語では、変数とは未知の存在を表し、
単一化により未知を未知のまま扱う(=計算する)ことができる
それは、人間の持つ自然な「等しい」という高度で抽象的な概念により近いはず
これ以上はスレ違いになるから、続きは Prolog スレで a,=[1,2,3]
こういうのがキモい。
そうしたいときはあえて(a,)とカッコをつけて書くようにしてる。 >>49
LispよりPrologの方が難しいと思うけどな
Lispは表記が読みにくいだけで動作はシンプルだけど
Prologは言語の挙動を理解するのが大変 Ruby, JS スレには、関数厨が、わんさか湧いてくるw
魔境に、片足を突っ込んでる、言語だからかな?w 「回答」ではなく「自分の知っていること」を長々と書くだけだから同定と回避はしやすいね https://togetter.com/li/1021897
"型は絶対書きたくない" "Ruby3は東京オリンピックまでに
" Rubyの父Matzによる、「楽しいプログラミング体験を届けるために」
#rubykaigi 2016 Keynote
↑これを読んで本当に安心した
少なくともあと10年はRubyで型を書かなくてもよさそうな雰囲気
これで他の言語よりさらに10年遅れることになる
そのころにはすっかり浦島太郎でゴミになってることだろう、良かった
いや、もうすでにゴミなんだろうけど、その認識がもっと広まって
周知徹底していく過程が楽しめる
それでも完全放置プレーされてて単に周りから取り残されて風化していくんなら
それは自然現象なのでありふれてるっつーか、俺自身も含めて皆そうだしアレなんだけど
Rubyの良いところは頑張るんだけど方向性がおかしくてダメ、無意味な努力というのが良い
どのあたりで「折れる」のか、はたまた意地を貫き通して本当に「終わる」のか、見ものだ
これだけ啖呵を切って自ら退路を断ったのだから、ぜひとも華々しく散ってほしい このようなことが本当に可能なのかどうなのか
メソッドが動的に生える場合は対応できないのは仕方が無いとしても
代入という代入を過去も含めてすべて精査しなければ、その変数に
何が入りえるかなど分かりようもない
プログラムが分岐していたら可能性が二つに分岐する
もっと端的に、配列のようなコンテナで
静的型言語なら同じインターフェースを持ったオブジェクトしか入らないわけだが
Rubyのような言語の配列はごった煮状態になりえるわけで・・・
さらに言えば変数への代入にしたって、同じ変数を、使いまわすかもしれない
変数へアクセスするときに適切に型スイッチしているならそれは合法なコードだが
検査ツールはそのことを検出して合法と決断を下さなければならない
型推論もコードを追わないといけないし、適切に使われているかもコードを追わないといけない
両方が泥団子であり、全くの不毛である
型という仲介を通して両者をつなぐとスッキリすることは既に十分実験されていて
分かり切ってるのにあえてこのような泥団子を好む人はいない
これから先このような無意味で壮大なことに労力を割くことで
Rubyのその他の面の進歩はどんどん遅れて、周りから取り残されていくだろう
10年単位で
是非そうなってほしい 動的型が当たり前の時代が有ったり、静的型が当たり前の時代が有ったり
両社は振り子のように揺れ動くものであるから
今は静的型が人気だが、いづれ動的型の時代が来るかもしれない
今、安易に静的型を取り入れると、そのときになって対応できなくなるから
Rubyには静的型を入れない
↑という言い分だが、そもそもが全くの嘘、でっち上げである
思い出してみれば分かるが、動的型の時代など、「無かった」
C言語が登場して以来、ずっと静的型の時代だっただろう
時系列で言えば、C → C++ → Java → C# という感じの登場順かな
これらの言語は今でも人気がある、というか、先頭集団
ずっと継続して人気者のグループ
これらの言語にRubyが勝ってた時代があったか?
だから振り子のような現象というのが、もう、真っ赤なウソ
動的型言語の時代などなかったし、これから動的型言語の時代が来ることもない
とにかくあの人は隙あらば嘘をついて人をだまそうとする
例のカルト宗教の勧誘で得たテクニックなんだろうか、知らんがな
もう一つの嘘は、動的型言語でもJavascriptのように速度が速い言語もある
だから速度を上げるために静的型を入れる必要はない、っていうやつ
まぁ嘘っつーかアレだが、Javascriptは物凄く多大な労力かつ非常に高度なことをやって
あの速度を得ているわけだが、そんな実装はRubyでは無理って自分で分かってる癖に
しれっとこういうことを言う
だったら今すぐV8エンジン並みの実装用意しろよ、出来るんだろ? RubyだけでなくPythonやJavaScriptのような
広く普及している動的言語があるのに
一方的にゴミ呼ばわりする方がゴミ 本当にそうであろうか
Pythonは型アノテーションを入れて過去の過ちを修正して未来へ向かおうとしているし
JavaScriptは実際ゴミ呼ばわりで、静的型のTypeScriptが評判良いし
まぁそのうち静的型の機能を取り入れるでしょう
あと、PHPも静的型の機能を取り入れているし
Perlも静的型の機能を取り入れている
徐々に周りは進歩している
ちょうど資本主義を受け入れた中国のようだ
Rubyだけが時が止まってて取り残される恰好なのに
さらに時を止めるつもりらしい ->「型は絶対書きたくない」
まるで北朝鮮といったところか
今は東京オリンピックまでに大陸間弾道ミサイルを作りたいと張り切っている
斜めっぷりというか、掛け違えたボタンというか
一回崩壊しないと正すのは無理なのかもしれないな プログラマが本当に必要だったもの:nullセーフ
という気がしている 海を越えられないから自転車は使えないとか言って近所のコンビニに行くだけのために
テポドンを持ち出してくるようなゴミクズがまた出たのか なぜ、ある言語を批判したいというモチベーションが沸くのか不思議
オカンの料理を食うだけの穀潰しによって、オカンの料理は批判されるのである >>69
>まるで北朝鮮といったところか
>斜めっぷりというか、掛け違えたボタンというか
>一回崩壊しないと正すのは無理なのかもしれないな
自己紹介乙 東京のIT企業が松江に進出08/28 20:15nhk
松江市の技術者が開発したプログラミング言語「Ruby」を活用したシステム開発
を目指して、東京に本社を置くIT企業が松江市に進出することになりました。
新たに進出するのは東京に本社を置くIT企業、「パソナテック」で、28日、
吉永隆一社長が県庁を訪れました。
県庁では調印式が行われ、吉永社長と溝口知事、それに松江市の松浦市長が互いに
連携して事業を進めていくとする覚書にサインをしました。
「パソナテック」は新たな事業所を松江市朝日町のビルの一室に設けて、9月から
運営を開始します。
今後3年間で10人を採用する計画で、松江市の技術者が開発したプログラミング
言語「Ruby」を活用して企業の管理システムの開発を手がけるほか地元のIT
人材の育成などにも力を入れることにしています。
県や松江市も雇用の創出や地域産業の高度化につながるとして企業への助成など支援
を行うことにしています。
吉永社長は「人口減少や高齢化などの課題がある中、地方であっても優秀な人が活躍
できる環境を、産官学で連携しながらつくっていきたい」と話していました。 スレチかもしれませんが質問です。
爆サイというサイトで「なりすまし防止」でパスワードを入れたんですが、解析されて同じトリップを相手に使用されました。
気持ち悪くて怖くなり、それ以来やっていません。
62^4=14776336通りもあるパスワードをどうやって解析したんでしょうか?
もし解析ができるなら、やり方までは聞きません。
解析ができるのかできないのかを知りたいです。お願いします。 >>76
本当に62^4通りなのでしょうか?
もしそうなら、総当たりで調べたのでは無いでしょうか? >>76
Ruby関係ないが
「1234」みたいな簡単な
パスワードはバレてること多いぞ >>77
数字と英文字の小文字も入れられるんで、その数字になります。
総当たりと言っても、ほんの数分で解析されてしまいました。
カメラから「おまえの顔も見えているぞ」とまで言われました。
ハッタリかと思っていたんですが、なりすまし防止のパスを解析されて、正直おどろき、どこからどこまでがハッタリなのか判らなくなってしまいました。
>>79
数字と英文字を混ぜたパスだったのですが、なぜか解析されてしまいました。
ご返答ありがとうございます。 >>76
トリップはぶつかることがある
元のパスワードと違うパスワードでも同じになるから
正確には62^4=14776336通り以下ってことになる Ruby + Sinatra + thinでWebアプリの開発を始めました。
ruby Server.rb -p 8080でthinを起動し、ブラウザで表示を確認しながら作ってます。
Server.rbを編集する毎にthinをstop'n'runしてます。
thinを終了する事なくServer.rbを編集結果をブラウザに反映させる事はできないでしょうか?
いちいちCTRL+C to stopしたく無いです。 >>82
require 'sinatra/reloader' >>81
そうなんですか、参考になります。
しかし、ほんの数分で一致させるなんて偶然では無理ですよね?
解析ソフトのようなものが存在してるんでしょうか?
不思議で仕方ありません。
クレクレで、すみません。 やったぁ。解決
Sinatra/reloader
つかうのね。 >>87
すみません。どこのカテゴリーで尋ねればよろしいでしょうか? >>89
カテゴリー→プログラム→初心者という文字発見→スレチ覚悟で質問→マルチ扱いで、早速いじられる
こんな感じです。
ここなら専門的な人達が揃ってると思ったの質問してみました。 セキュリティ板とかインターネット板の
質スレで聞くか自分でスレ立てるか まだこっちのほうがいいんじゃないの
スレ立てるまでもない質問はここで 146匹目
https://mevius.2ch.net/test/read.cgi/tech/1487825717
てかスレチを承知していたのなら初めから誘導先を質問すればいいのに >>91
スレは立てられないんです。
このホストでは……という言葉が出てきてしまいまして。
すみません。ありがとうございます。
>>92
ご親切にありがとうございます。 >>74
大阪のハローワークでも、キヤノンなど、パソナテックの募集は多い。
つまり、できる人が見つからない
スレ違いだけど >>1
【緊急】
すき家の定食に衝撃異物!
ずさんな管理体制が明らかとなった
指摘したその時!わざとらしく店員が声をあげごまかした!
229 名前:やめられない名無しさん [sage] :2017/08/29(火) 07:31:54.64 ID:EfhOnUp0
俺の朝はいつもすき家
楽しみにしてたのに・・今日に限って朝定食にしたんだ
見てくれ、これが証拠
店員さんも驚いて声をあげてる・・
https://www.youtube.com/watch?v=wjD4hUeU-CA
ちなみに半分食べた
お客様センターが通じない・・病院行く・・
(´・ω・`)すき家が大好きだったのに・・ progateでruby勉強してるんだけど到達点どれくらい? Win32APIライブラリでCreateWindowExいじってたら、割りと簡単にウィンドウ表示までは出来た
この先、作成したウィンドウのイベントメッセージ読むのとかプロシージャーの登録とかって可能なの?
Rubyのオブジェクトをwindowsのシステム側で扱う事に全然イメージがわかない ■ このスレッドは過去ログ倉庫に格納されています