トップページ⇒tech
1001コメント332KB

Ruby 初心者スレッド Part 56©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2014/12/13(土) 09:29:12.93ID:DLY4IovQ
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 55
http://peace.2ch.net/test/read.cgi/tech/1403361584/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
04214062015/01/20(火) 18:05:32.81ID:tR2SZl1M
>>417 自己レス
Kernel.send :define_method, :go do |
per_ary, layer=0, total_time=0 |

トップレベルで、define_methodを呼び出すのをやめて、
def go(per_ary, layer=0, total_time=0)

このように普通の関数に戻して、
関数内で使う変数を、すべてグローバル変数に替えたが、
やはり同じ現象が起こる。原因不明
0422デフォルトの名無しさん2015/01/20(火) 18:09:03.35ID:bOdKTSkA
>>417
例えば
ary = ("A".."D").to_a
ary2 = ary.dup
ary2[0] += "B"
だとary2だけ変更されるけど
ary2[0] << "B"
とか
ary2[0].downcase!
だと両方変更される
この時、aryとary2は別の配列オブジェクトだけど、それで参照される要素は同じオブジェクトだから
代入なら一方だけしか変更されないけど、参照されるオブジェクトの破壊的メソッドを呼び出すと両方変更される

定数が定数じゃないのはrubyの仕様
0423デフォルトの名無しさん2015/01/20(火) 18:12:22.71ID:tR2SZl1M
>>420
そのまま変数に代入できないの?
.to_a は?

ary = ('A'..'D').to_a
["A", "B", "C", "D"]
0424デフォルトの名無しさん2015/01/20(火) 18:15:39.95ID:M5BHFTcG
>>420
evalじゃダメなの?
0425デフォルトの名無しさん2015/01/20(火) 18:24:07.45ID:7ow9yZfB
>>424
ありがとうございます。
evalあったんですね(^_^;) あっさりできました。
ずっと#{ }でなんとかするのかと格闘してました。スレ汚しすみませんでした。
04264062015/01/20(火) 18:54:32.80ID:tR2SZl1M
>>417 自己レス
ary2 = $Person_ary[0..-1]
go(ary2)

このgoが再帰関数になっていて、引数に配列を渡していくから、
ずっと同じ配列をいじくっているのかな?

ary2 = $Person_ary[0..-1]

でもこの文で、すべての要素がコピーされて、
ary2と$Person_aryは、別々のオブジェクトにならないの?
04274062015/01/20(火) 19:10:13.93ID:tR2SZl1M
>>426 自己レス
>ary2 = $Person_ary[0..-1]

>でもこの文で、すべての要素がコピーされて、
>ary2と$Person_aryは、別々のオブジェクトにならないの?

object_idは異なっていた
0428デフォルトの名無しさん2015/01/20(火) 19:11:36.56ID:bOdKTSkA
>>427
ary2[0]とPerson_ary[0]のオブジェクトIDを調べてみ
0429デフォルトの名無しさん2015/01/20(火) 19:19:52.78ID:jzLWySUR
>>380、>>386あたりで解決してんじゃん。
答えてもらっても実践しないなら初めから質問なんかしなければいいのに。
04304062015/01/20(火) 19:39:26.27ID:tR2SZl1M
>>427 自己レス
ary2と$Person_aryの、object_idは異なっていたが、

ary2[0]と$Person_ary[0]の、object_idは同じだった!


もう気が狂いそう。爆発します
カタカタ、カタカタ、カタ、ドッカーン!
0431デフォルトの名無しさん2015/01/20(火) 19:48:41.70ID:I5Fz89mC
次書き込んだら殺す
0432デフォルトの名無しさん2015/01/20(火) 19:48:48.59ID:5Fj8tUhx
>>430
>>422の人が丁寧に解説してくれてるだろ
0433デフォルトの名無しさん2015/01/20(火) 19:51:03.94ID:q7S0YejK
>>431
弁護はまかせろ
04344062015/01/20(火) 19:57:22.33ID:tR2SZl1M
>>401
では、aa[1]に代入しても、
配列x,xxは変化しなかったのに、なぜ、
>>430 のような事が起きるの?

aa[1]に代入した瞬間に、
別のオブジェクトが作られるのかな?

aa = [1, 2, 3]

x = aa[0..100]
xx = aa[0..-1]

aa[1] = 'B'

p aa #=> [1, "B", 3]
p x #=> [1, 2, 3]
p xx #=> [1, 2, 3]
0435デフォルトの名無しさん2015/01/20(火) 20:05:02.74ID:5Fj8tUhx
>>434
だから>>422読めっての
04364062015/01/20(火) 20:19:04.50ID:tR2SZl1M
元の配列を変更しないように、
すべての要素をコピーして、関数に渡しているのですが、
Person_ary = ('A'..'D').to_a
ary2 = Person_ary[0..-1]
go(ary2)

def go(per_ary)
go(再帰関数に、また別の配列を渡す)
end

どこで、ary2, per_aryを変更しているのか、
変更箇所が見当たらない

そして知らぬ間に、まるで魔法のように、
Person_aryの'A'が、'AB'に変わってしまう
["A", "B", "C", "D"]
["AB", "B", "C", "D"]
0437デフォルトの名無しさん2015/01/20(火) 20:25:57.00ID:JNlE/+5w
いちいち○○読めとかお前のブログじゃねえとか突っかかってる奴は
首の上にカボチャでも載せてんですか
0438デフォルトの名無しさん2015/01/20(火) 20:28:40.86ID:w3vLPuuc
いやいやID:tR2SZl1Mは擁護できないだろ
答えても無視して同じ質問ダラダラ繰り返すんだから邪魔で仕方がない
0439デフォルトの名無しさん2015/01/20(火) 20:32:23.61ID:7DC6CjZy
>>437
>>349あたりから読んでも同じことが言えるかな?
0440デフォルトの名無しさん2015/01/20(火) 20:35:37.31ID:JNlE/+5w
いやいや、荒らしには触らないなんて基本的なことを理解してないようだから
頭がついてないか空洞なんだと思ったけど違ったか?
0441デフォルトの名無しさん2015/01/20(火) 20:36:27.21ID:7DC6CjZy
はい、そのとおりです。すみませんでした。
0442デフォルトの名無しさん2015/01/20(火) 20:44:23.29ID:q7S0YejK
配列のCoWとか面白い話題なんだけど展開が残念

>>425
念のためだけど外部からの入力にevalしないでね
eval "[1, 2, `del yourfile`]" とかで死ぬから
0443デフォルトの名無しさん2015/01/20(火) 21:24:14.75ID:4I0Y1qEs
require 'yard'
include Math
とするとyardの中にもMathにもlogというメソッドがあるため不具合が生じてしまいました
yardのlogはほとんど使わないしまた使われてもいないのでファイル中のlogを別の名前に置き換えて対処しているのですが、とても良い方法とは思えません
何かうまい方法はないでしょうか?
04444062015/01/20(火) 21:53:24.90ID:tR2SZl1M
$Person_ary = ('A'..'D').to_a
#=> ["A", "B", "C", "D"]

ary2 = $Person_ary[0..-1]
go(ary2)
def go(per_ary)

combi = per_ary.combination(2)
combi.each_with_index do |p_ary, i|
# per_ary[0] → p_ary[0]は同じobject_id

per_0 = p_ary[0]
何でこの代入が(値は'A')、同じオブジェクトやねん!
これぐらい別のオブジェクトにしろよ

$Person_ary[0] → ary2 → per_ary[0]
→ p_ary[0] → per_0
なんと、これらがすべて同じobject_id

per_0 << 'B'

per_0には'A'が入っているが、
最後にこれらがすべて、'AB'に変わってしまう!

ここまですべてが同じオブジェクトだって、誰がわかる?
0445デフォルトの名無しさん2015/01/20(火) 22:03:00.40ID:tR2SZl1M
>>443
その関数だけ、
モジュール名を付けて呼び出せないの?

Math::log
0446デフォルトの名無しさん2015/01/20(火) 22:06:10.20ID:B3TactEM
>>436
恐らく誤って変更してしまっているのは配列ではなく、文字列のほう。
Rubyの文字列は変更可能。そして += と << が等価ではないのもそれに起因する。
「str<<式」はstrが参照する文字列自体を変更する。
「str+=式」はstr+式の新たな文字列を作成し、strが新たな文字列を参照するように変える。
0447デフォルトの名無しさん2015/01/20(火) 22:10:24.86ID:4I0Y1qEs
>>445
require 'foo'
require 'bar'
実際は上のように使っていて、
fooではrequire 'yard'、barではinclude Mathしており
どっちもモジュール名などを付けずに書かれているので困っているのです。
0448デフォルトの名無しさん2015/01/20(火) 22:10:58.55ID:OvbknBRr
rubyとpython両方使ってると今でも
文字列の変更可能性と定数の扱いで混乱しちまう。
0449デフォルトの名無しさん2015/01/20(火) 22:14:39.33ID:q1aCw1+q
>> 444
初心者が嵌りやすいトラップだ。いい勉強になって良かったね

昔ruby trapっていうドキュメントがあったけど無くなっちゃったのか?
04504062015/01/20(火) 22:28:19.59ID:tR2SZl1M
combi = A.combination(2)
combi.each_with_index do |B, i|

C = B[0]

A[0] → B[0] → C

文字列が入っているとして、
これらが同じobject_idなのは、予想できんわ
0451デフォルトの名無しさん2015/01/20(火) 22:33:30.37ID:mp2703SQ
Rubyの変数はすべてCのポインタだとおもっとけばいいんじゃないかな(適当
0452デフォルトの名無しさん2015/01/20(火) 22:35:08.90ID:mp2703SQ
ポインタからポインタに代入してもオブジェクトはコピーされないし
ポインタの配列をコピーしても中身はコピーされないし
ポインタ自体をconstにしても参照先は書き換え可能だし
0453デフォルトの名無しさん2015/01/20(火) 22:45:19.24ID:LYCYgqf6
>>447
YARD が「トップレベル」の名前空間でメソッド log を宣言しているのが問題だね
さらに bar でも「トップレベル」でモジュール Math をインクルードしているから、
名前 log が衝突していると ....
YARD と bar、どちらの作者ともに作品がライブラリとして再利用される事に対する
想像力が欠けていた、あるいは思慮が足りなかったと言うしかない

もしも bar を作ったのが >>447 自身であるなら、
bar 全体を独自のモジュールとして定義し、
その中で Math をインクルードすれば衝突を回避できる(Math.log が優先される)

 module Foo; include Math; .... end

そうでないなら、お手上げだなあ
0454デフォルトの名無しさん2015/01/21(水) 01:22:41.56ID:nNlZ8uj4
  ★★★二度と戦争をしない為に最も確実な方法は、日本が核を持つことである★★★
  http://jbbs.livedoor.jp/study/3729/storage/1069408696.html#82

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
  この掲示板に優秀な書き込みをして、総額148万円の賞金をゲットしよう!(*^^)v
0455デフォルトの名無しさん2015/01/21(水) 01:57:16.89ID:xWoGAr8y
Array の初期化の仕方がほんっとわからん。
特に2次元で初期化しようと思ってうまく出来た事がない。
いつも結局バカみたいに代入することになる。
0456デフォルトの名無しさん2015/01/21(水) 02:41:54.86ID:/GBHGoCO
分かる
多次元の初期化は手間がかかって困る
0457デフォルトの名無しさん2015/01/21(水) 03:15:12.53ID:qBatZceh
>>455
イテレーター使ってる?
二次元配列を
Array.new(10, Array.new(3))
みたいにやっても駄目
Array.new(10){Array.new(3)}
ならちゃんと二次元配列になる
上の書き方だとArray.new(3)が呼び出されるのは一回だけで、その一つのオブジェクトをすべてが参照してる状態になってる
下だと要素の数分Array.new(3)が呼び出されて、それぞれが別のオブジェクトを参照してる状態になる
0458デフォルトの名無しさん2015/01/21(水) 04:27:38.93ID:Jm/vxooP
$ irb
irb(main):001:0> mtx = Array.new(3) { |y| Array.new(2) { |x| [x, y] } }
=> [[[0, 0], [1, 0]], [[0, 1], [1, 1]], [[0, 2], [1, 2]]]
irb(main):002:0> puts mtx.map { |xs| xs.map {|(x, y)| format("(%d, %d)", x, y )}.join(', ') }.join("&yen;n")
(0, 0), (1, 0)
(0, 1), (1, 1)
(0, 2), (1, 2)
=> nil
irb(main):003:0>
0459デフォルトの名無しさん2015/01/21(水) 11:01:19.39ID:NFFhaRBc
>>442
>念のためだけど外部からの入力にevalしないでね
>eval "[1, 2, `del yourfile`]" とかで死ぬから
ありがとうございます。
そんな高度な事はしてないので問題ないのですが、考えてみると怖い命令ですね。
0460デフォルトの名無しさん2015/01/21(水) 12:30:39.60ID:aA1tn61G
YAML使えばいいんじゃね?
0461デフォルトの名無しさん2015/01/21(水) 21:20:45.16ID:UODHxGjG
YAML.loadはinitializeを経由せずインスタンスを生成する。
ゆえにnilの代わりにカラ配列を使ってるような構造には弱い。
0462デフォルトの名無しさん2015/01/21(水) 23:32:42.08ID:2ayQ13oI
個人的にはArray.newなんてほとんど使わんな
大抵は
(1..n).map{|i|(1..m).map{|j| i+j }}
みたいにmapで作るわ
0463デフォルトの名無しさん2015/01/21(水) 23:46:58.80ID:e6Du7UL/
mapとかfilterとか使うなら事前に配列作っとく必要もなくね
関数型スタイルに近づくと配列をインプレースで更新すること自体あんまりやらなくなるからな
0464デフォルトの名無しさん2015/01/22(木) 23:36:58.70ID:7mvG+vzB
mapとか統一的に使うためにカラ配列にしとくんじゃないのか?
nilだとmethod_missingになっちまうし。
俺はnil?で場合分けする方が特異に感じる。
0465デフォルトの名無しさん2015/01/23(金) 00:28:00.11ID:jEuXrIMX
>>464
そうじゃなくて、使うときに作るんだよ
大抵、事前に配列を初期化する必要があるのは配列作った後で中身を更新する場合だ
0466デフォルトの名無しさん2015/01/23(金) 07:55:08.06ID:0oMxYtZz
>>459
亀だけど、他スクリプトの文字列配列を“任意記号でつなげた単なる文字列”にしといて、受け取る側でsplitする方法もある
多少面倒臭いけどeval乱用しなくて済むと思う
0467デフォルトの名無しさん2015/01/23(金) 08:03:28.83ID:4FZvpJWI
gem使えるならparser#literal_evalみたいなのを使う
ぜひ標準で欲しい
0468デフォルトの名無しさん2015/01/23(金) 10:26:57.08ID:kLOpfBTA
if 条件1
 文 if 条件2
end

if修飾子(後置if)
これでも、文の構造を間違わないのには感心する。
たぶん、if,endの数を数えているのだろう

それに、++,-- のインクリメント・デクリメントが無い。
グローバル変数には、'$'を付ける。
内側のスコープで、外側の変数を使えない

これらにより、ややこしい間違いを防げるなど、
Matzはよく考えているな
0469デフォルトの名無しさん2015/01/23(金) 11:33:14.50ID:jEuXrIMX
そんなもんコンパイラ技術の基本中の基本
初心者向けの本一冊読めば>>468でも作れるよ
0470デフォルトの名無しさん2015/01/23(金) 15:30:18.97ID:rINQxVSH
Rubyガチの初心者レベルが集まってるようなサイトや掲示板って無いでしょうか?

対処として本家メーリングリストを覗いてみたのですが・・ 
お馬鹿な質問してる人はほぼいないので迷惑がかかりそう・・

いまの対処法はサンプルコードを時間をかけて探す・・
その中に理解できないのがコードがあると、さらに積み重なり・・・ それを調べるとどんどんと深みにハマっていき
いったい何を探しているのか・・・ 泥縄式
0471デフォルトの名無しさん2015/01/23(金) 15:36:10.47ID:ca5XUMYE
http://peace.2ch.net/test/read.cgi/tech/1418430552/
0472デフォルトの名無しさん2015/01/23(金) 16:06:21.22ID:3yNzan63
>>470
答えられるかわからないけどためしに質問してみては
0473デフォルトの名無しさん2015/01/23(金) 16:15:03.63ID:uMcR+6pK
>>470
何か作りたいものを決めて、どうやって作るかという観点で学習したほうが速いと思う。
0474デフォルトの名無しさん2015/01/23(金) 17:08:49.68ID:kLOpfBTA
>>470
漏れが今から、初心者としての手本を見せてやろう↓

=begin
〜
〜
=end

ファイルAの中で、=begin,=endで囲まれた部分を、
すべて除いたものを、ファイルBに出力したい

そういうツールある?
無ければ、誰かソースコードを書いて!
お願いしま〜す
0475デフォルトの名無しさん2015/01/23(金) 17:21:36.65ID:3yNzan63
ruby -e'print ARGF.read.sub(/^=begin.*^=end/m, '')' fileA.rb > fileB.rb
04764742015/01/23(金) 17:39:05.42ID:kLOpfBTA
有難うございますた。ペコリ

>>470
ほらね。ものの10分ほどで、
誰かが書いてくれまっしゃろ

ttps://paiza.io/
そしてこれをここにコピペして、実行しますのよ
0477デフォルトの名無しさん2015/01/23(金) 17:45:50.50ID:flsP1yua
作りたいもの作ればいいんじゃね?
コード読むとかまじめ過ぎんよ
0478デフォルトの名無しさん2015/01/24(土) 07:15:10.75ID:CE2XF3sB
64bit Windowsに32bit Rubyを入れているのですが、DevKitはどちらのバージョンを入れればよいのでしょうか?
0479デフォルトの名無しさん2015/01/24(土) 10:28:15.06ID:sa+x1Xzy
正直、ネイティブ拡張が必要になった時点で
pure windowsは諦めてvagrant使うのが一番手っ取り早い
0480デフォルトの名無しさん2015/01/24(土) 17:50:50.26ID:zRrZ/E6b
http://codezine.jp/article/detail/8409

Ruby開発者・まつもとゆきひろ氏の新言語「Streem」のソースコードを読んでみよう! 〜 文法と構造を規定する「lex.l」と「parse.y」
0481デフォルトの名無しさん2015/01/24(土) 22:42:20.52ID:sZsKSyLo
Rubyやめて新言語かよ
とおもったら言語設計の学習向けサンプルか
0482デフォルトの名無しさん2015/01/24(土) 23:03:03.44ID:sa+x1Xzy
Rubyで再起下降パーサ書くとかなら面白いかもしれないが
今更C & yaccとか紹介されてもなあって感じ
こんなもんわざわざMatzが解説しなくてもどの教科書にも載ってるだろ…
0483デフォルトの名無しさん2015/01/24(土) 23:13:51.32ID:4gU3kMxY
言語ヲタクとして後継を育てたいんだろう
0484デフォルトの名無しさん2015/01/24(土) 23:33:26.92ID:sZsKSyLo
このcodezineの記事はMatzの記事じゃないでしょ
Matzのは日経Linuxに載るそうな
0485デフォルトの名無しさん2015/01/24(土) 23:41:25.90ID:uW+Hb/Mt
処理系の作成に使われてる技術や考え方は他でも役立つものばかり
自分は使う側だからと思ってる人も一度はトライすべき

だとわかっていながらやらずに10年が経った
0486デフォルトの名無しさん2015/01/24(土) 23:57:28.38ID:sa+x1Xzy
>>485
考え方には同意するが、勉強目的で処理系を作るなら字句解析や構文解析は手書きするべきだと思う。
他で役立つのって特にその部分だから。
0487デフォルトの名無しさん2015/01/25(日) 00:20:22.56ID:J7dtxD4G
>>486
そうかぁ?
構文解析とか泥臭い部分はライブラリに投げた方が勉強する部分にフォーカスできると思うけどなー
lexとかyaccは実績も超がつくほどあるものなんだし
0488デフォルトの名無しさん2015/01/25(日) 00:29:56.97ID:6mma36Hg
練習課題で作るような簡単なスクリプト言語ならASTができた時点で終わりみたいなもんじゃね
あとはノードに対応する処理を適当に書いていくだけで、それこそ単純作業だわ
ソースコードのパースは再帰とか抽象化とかプログラミングの基礎体力を付けるにはいい練習だよ
0489デフォルトの名無しさん2015/01/25(日) 00:33:47.61ID:J7dtxD4G
>>488
プログラミングと言語設計とは別の話だと思うが
0490デフォルトの名無しさん2015/01/25(日) 00:45:12.52ID:DUp54GVi
お題 Rubyの配列パーサを書け
配列の要素は配列([...])、正の10進数(123)、ダブルクォート文字列("...")に限定
例 [1, 234, [5, "67", []], 8]

30分で解けたらこのスレ卒業
0491デフォルトの名無しさん2015/01/25(日) 14:43:11.53ID:R3Fg53IN
redmineのアップグレードってgem updateじゃできませんよね
なんか簡単にできるほうほうありませんか?
毎回ソースコードをダウンロードして解凍してgemをインストールしないとダメなんでしょうか?
0492デフォルトの名無しさん2015/01/25(日) 17:00:44.18ID:n4z0u1el
そんなに手間か?
公式のSVNリポジトリからチェックアウトするようにしてもいいけど、
実運用でheadを使うのはさすがに危険だから結局バージョンは選ばなきゃいけないので大して手間変わらん
0493デフォルトの名無しさん2015/01/25(日) 18:11:58.87ID:3aXiO/4E
あああそうれいいですね
git pullしたら楽でした
でもgit tagに2.6が含まれていませんでした
githubのredmineのtagを見に行ったら2.6.1まであったのに何故ですかね
0494デフォルトの名無しさん2015/01/25(日) 18:39:45.60ID:KIPmV6lx
windowsでpryをインストールしようとしたら
bad response Not Found 404って出てきてできないんですが
どうしたらいいですが?
0495デフォルトの名無しさん2015/01/25(日) 20:47:42.10ID:6mma36Hg
>>493
公式のSVNリポジトリ使いなよ
gitのはあくまでミラー
0496デフォルトの名無しさん2015/01/26(月) 17:03:01.35ID:5plsOsTa
SVNでいれることにします
ありがとうございました
0497デフォルトの名無しさん2015/01/26(月) 19:42:21.97ID:vPTi7mVl
redmineのガントチャートで週の始まりが月曜からなんですが
これ日曜から始まるようにする設定て何処でするんですか?
0498デフォルトの名無しさん2015/01/26(月) 22:29:09.39ID:BphtuPQw
>>497
https://groups.google.com/forum/#!forum/redmine-users-ja
04994742015/01/27(火) 10:05:23.11ID:giG1hU9r
>>474-476
475のやり方だと、
=begin
〜
=end

〜この部分も、削除されてしまう

=begin
〜
=end

=begin,=end間は(=begin,=endも含めて)削除したいが、
=end,=begin間はそのまま残したい。HELP!
0500デフォルトの名無しさん2015/01/27(火) 11:29:39.64ID:JO7zk1Y+
*を*?にすれば
0501デフォルトの名無しさん2015/01/27(火) 17:05:12.78ID:AnZGR/ca
>>500
「最初のbegin〜endしか削除されません」とか言ってきそう・・・
0502デフォルトの名無しさん2015/01/27(火) 23:03:18.27ID:6gdvwZDa
複数の配列の初期化を、変数の同時代入でやろうとしたら
何か変なんですがこれはどういう現象なんでしょうか?遡って代入されてる?

a = b = 1
a = 3
p a #=>3
p b #=>1 bは弄ってない
p "-----"
a = b = []
a << 3
p a #=>[3]
p b #=>[3] 何も入れてないのに勝手に3入ってる

aとbを逆にしてもaに勝手に3入ります
0503デフォルトの名無しさん2015/01/27(火) 23:34:18.96ID:w1lsmrbK
>>502
一口で言えば、代入演算子(参照先変更)と<<演算子(参照先は変更しない)の違い

>a = b = 1

a と b が 1 という同一のオブジェクトを参照するようにする

>a = 3

a が 3 というオブジェクトを参照するよう変更する

>a = b = []

a と b が新規の、同一の空配列オブジェクトを参照するように変更する

>a << 3

a の参照先オブジェクト(b と同じ配列)に対して << メソッドを、3 を引数として呼び出す
その動作として、a の参照先オブジェクト(b と同じ配列)に 3 という要素が追加される

と言うわけで、勝手には入ってない
0504デフォルトの名無しさん2015/01/27(火) 23:42:27.51ID:/EXITyOc
2つのキーを指定したとき(順不同)に一意の値に決まるハッシュようなデータ構造を作成したいんですが、
例えば、
p a["山田","田中"] #=>8
p a["田中","山田"] #=>8
p a["山田","加藤"] #=>2
のような感じです
どのようにすればいいでしょうか?
0505デフォルトの名無しさん2015/01/27(火) 23:52:53.45ID:ed+BP8Ek
キーをソートすればよい
0506デフォルトの名無しさん2015/01/28(水) 00:01:14.15ID:e5hkyOyG
>>505
ありがとうございます
やっぱりソートしてから引数にとるしか方法は無いんでしょうか…
呼び出したい時に一々ソートするのはスマートで無い気がして…
0507デフォルトの名無しさん2015/01/28(水) 00:36:13.90ID:UCeJVedt
ならクラスにラップすればいい
小手先の実装のスマートさなんかどうでもよくなる
0508デフォルトの名無しさん2015/01/28(水) 00:50:00.54ID:e5hkyOyG
>>507
なるほどそうですね
ソートしてアクセスする構造をクラスでラップして使うことにします
ありがとうございます
0509デフォルトの名無しさん2015/01/28(水) 06:54:30.56ID:PxKHvaRd
>>503
返信遅れましたありがとうございます
代入って単純に引数与えるだけじゃないんですね
配列も"n"と同じようにリテラルぶっ込んでるだけだと思ってたのに複雑だ・・・
05104062015/01/28(水) 09:32:53.14ID:g/K+Ovy5
a=b=c=d=3
Rubyでは、このようにいくら代入しても、コピーが作られず、
単に参照(変数のアドレス)がコピーされるだけだから、
同一のオブジェクトを指す

ここで、文字列の連結に、<< を使うと、
すべての変数が変わってしまう。
+ を使えば別のオブジェクトが作られる

ここで、b=10とすれば初めて、
bは別のオブジェクトとして作られる。Cow(Copy on write)

必要に迫られるまで、なるべく
新たなオブジェクトを作らないようになっているのだろう

オブジェクトの内容そのものを変える、
破壊的なメソッドを呼ぶ際は、同一のオブジェクトは、
すべて変更されてしまうので要注意

漏れも、<< で苦しんだ。この辺を見て
>>434 >>444
0511デフォルトの名無しさん2015/01/28(水) 10:15:58.27ID:PxKHvaRd
初心者の自分が言うのもなんですが
質問するときは原因箇所を絞って簡略化したほうがいいですよ
その経過で解決する事もありますし
05124062015/01/28(水) 11:14:40.77ID:g/K+Ovy5
>>444
にも書いたけど、Rubyのさかのぼり代入は怖い
$a=b=c=d=3

ここで、d << 10 とするだけで、すべての変数が310になる。
この参照の連鎖は順次、
関数の引数に渡していっても、断ち切れない

グローバル変数までさかのぼって、変更されてしまう
0513デフォルトの名無しさん2015/01/28(水) 11:46:52.90ID:H7DQugwd
Rubyの言語仕様は洗練されていない
unlessなんて削除するべきだ
pとかよりもっとわかりやすい名前を付けるべきだ
0514デフォルトの名無しさん2015/01/28(水) 11:54:27.66ID:slxhZiXo
御自由にどうぞ
0515デフォルトの名無しさん2015/01/28(水) 11:55:41.74ID:slxhZiXo
コミッター連中を観察していれば分かるが
彼らは多少頭のネジが緩いんで
0516デフォルトの名無しさん2015/01/28(水) 13:03:50.23ID:g/K+Ovy5
Rubyだと、p, pp

Pythonだと、print, pprint
だから面倒くさい
0517デフォルトの名無しさん2015/01/28(水) 13:12:56.41ID:RMHK3Bx6
洗練されたクラスを作ればいいだけなのに
0518デフォルトの名無しさん2015/01/28(水) 20:51:43.59ID:JcHJzKkl
>>512
さかのぼる、と考えるから破綻するんよ。
変数に入ってるのは、あくまで参照。それだけ頭に入れてれば破綻しない。
0519デフォルトの名無しさん2015/01/28(水) 21:00:02.47ID:JcHJzKkl
copy on write なんて考えたこともないよ

基本的にRubyの変数は「何かを指し示しているだけ」であり「中身は無い」
中身のように見えるものは「名もなき場所にある」
代入という操作をしたとき、変数は別の場所を指すように書き換わる
それ以外の操作は、中身に対して行われる

そんだけだよ
さかのぼり代入なんてことは何もしてない
同じ人を指さしてるのに、別人に見えたらおかしい
0520デフォルトの名無しさん2015/01/28(水) 21:10:51.95ID:ncVbnS0H
ちなみに512に書いてある例は間違ってるから勘違いしないようにね
■ このスレッドは過去ログ倉庫に格納されています