トップページ⇒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/
0381デフォルトの名無しさん2015/01/18(日) 11:47:12.82ID:g7at9IyQ
>379
最近はrubyでも副作用は嫌われる傾向にあるので、
bbは渡された配列を変更せず新しい配列を返す実装にすべき。
bbの実装が変更できずやむを得ない場合は>380
0382デフォルトの名無しさん2015/01/18(日) 12:12:41.32ID:YQ/T1PKN
>>379のような状況が出てくること自体が理解できない
bbが引数の内容を変更するってことはその変更された結果を後で使うんだろ?
ならコピーして渡したところで意味がないんじゃないの?
もしくはbbが引数を変更しつつまた別の結果を戻り値として返したり別の場所に副作用を起こすような意味不明な仕様なのか?
0383デフォルトの名無しさん2015/01/18(日) 14:22:54.74ID:AMauTogu
いやだからその場合でも
bb(ary.dup)
でいいよ

配列をコピーするというメソッドはあるが記法はない
0384デフォルトの名無しさん2015/01/18(日) 14:52:01.11ID:QxSzEZO/
dupじゃダメ
0385デフォルトの名無しさん2015/01/18(日) 15:02:37.63ID:AMauTogu
浅いコピーなのに気を付ける前提ならdupでいいでしょ
ダメとだけ書いても理解されない
0386デフォルトの名無しさん2015/01/18(日) 16:17:34.94ID:UJDOWW1C
ActiveSupport 突っ込んで Array#deep_dup なら deep copy もできる。
0387デフォルトの名無しさん2015/01/19(月) 00:38:55.11ID:kt81hAib
ちょっとお聞きします
rubyで遊ぶのに適した環境てやっぱりlinuxですか?


winのrubyを触ってて楽しいなと感じていたんですが、gemで蹴られたり、エンコードに癖があったりで
章を進めるにしたがい不便を感じ初めています。
最初からlinuxを選択するべきか悩みましたが
linxについてまるで経験がないので、rubyの前にlinux仕様を覚えなければならない手間の増加に腰が引け・・・winを選択したしだいです。

rubyを始めたばかりなので、「まずrubyの足元」を固めたい。
そのために「ハードルを下げたい」のですが
OSの選択と開発環境について何かアドバイスがあればお願いします。
独学で相談する相手もいないので、ubutuにしようか、winで続けようか、それともCentOs・・悩んでいます

(手違いで2ch.scに投稿したので2ch.netに書き直しです。.scは.net側から読めないため移動しました)
0388デフォルトの名無しさん2015/01/19(月) 00:54:14.54ID:hwzu+AsP
勉強段階ならWindowsでも十分かと。Linuxの方が楽なのは確かだが。
エンコードってそんなに面倒かな?
0389デフォルトの名無しさん2015/01/19(月) 01:05:43.71ID:kt81hAib
返答ありがとうございます
対処法を「探しあてる」までちょっと面倒だったりします。
まだ参考コードを片手に本と画面のにらめっこの段階なので・・・

参考コードをタイプして動かないと時間と精神的に・・・ 
0390デフォルトの名無しさん2015/01/19(月) 01:15:33.96ID:m1sXYci2
プログラミング初心者は日本語やgemに手を出すべきではないのだ
文法に慣れて標準ライブラリをいくつか使えるようになってからで十分
0391デフォルトの名無しさん2015/01/19(月) 01:42:43.59ID:QnWCi45e
エロ画像をまとめて落とすという目的こそが、ruby習得の最短
目的もなく勉強しても身につかない
03923682015/01/19(月) 03:02:48.75ID:aeY3ubQM
>>382
def bb(ary)
ここで配列を変更しながら、何回かbb()を呼ぶ
bb(ary)
end

ハノイの塔・将棋などのゲームの手順などを、
深さ優先のスタックの代わりに、
再帰関数で実装しているので、

個々の関数の中では、配列を変更するのだが、
別々の配列を使う方が、
変更した配列を捨てるだけでよいので、
元に戻す手間が省ける

>>387
漏れはWin8なので、TeraPadで書いて、
ttps://paiza.io/
にコピペして、実行している
0393デフォルトの名無しさん2015/01/19(月) 07:44:53.64ID:eQbtjaRR
このスレにいるくらいだから、当然だけど
もろ初心者ね
0394デフォルトの名無しさん2015/01/19(月) 08:01:08.16ID:UWF/Jaig
どっちが楽とかいう問題じゃなくて
WebがやりたいんだったらRuby云々よりも運用知識の方が重要なくらいだから
当然実際の稼働環境(UNIX系)となるべく似た環境で開発しないと意味がないし、
Winから他へ乗り換える予定もUNIXで何か運用する予定もないならLinuxで開発しても仕方ないだろう
言語なんかたかが道具だよ
0395デフォルトの名無しさん2015/01/19(月) 09:42:39.75ID:aeY3ubQM
Rubyist は、Ruby自体を楽しむ人だから、
Rubyをすること自体が目的

そんな小難しい話はいらない
Let's Ruby!
Ruby, Matz、鳥取・島根 万歳!

ここは初心者スレだから、難しい話をする人は、
もう一つのスレの方でやって
0396デフォルトの名無しさん2015/01/19(月) 10:44:00.79ID:D2Bly1oF
Windows対応を明記してある本を買ってきてそれで勉強したらいいんじゃない?
たとえば『作りながら学ぶRuby入門』は Windows/Mac OS X 対応だったよ。
0397デフォルトの名無しさん2015/01/19(月) 19:14:10.29ID:UWF/Jaig
最近だとWindows対応を謳いながら
VirtualBoxのインストールから始まる本が多いけどなw
0398デフォルトの名無しさん2015/01/19(月) 19:44:38.39ID:m1sXYci2
Windows/Mac/Linuxでの操作やインスコの手順が併記してある本とか
書くのも読むのも苦痛だからな・・・
0399デフォルトの名無しさん2015/01/19(月) 22:45:58.11ID:kJb8u5Xb
WebがやりたいならLinux(CentOS系)で始めろというのは全く同意するが
Windowsでも無価値ではないぞ。俺はShellscript代わりに重宝している。
Rubyとしては邪道な使い方かもしれんがそれでも
PowerShell人口よりは多いだろうよ・・・
0400デフォルトの名無しさん2015/01/20(火) 04:05:02.59ID:ce3GiAbD
str.lines do |line|
f.puts line.chomp!
end

ちょっぷしてぇええ!!
04013682015/01/20(火) 06:11:14.89ID:tR2SZl1M
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]

うおー![0..-1][0..100]など、
終わりのインデックスを、-1か、
最後の要素より、大きい数字を入れたら、
すべての要素が簡単にコピーできる!
0402デフォルトの名無しさん2015/01/20(火) 07:02:00.36ID:quI2Cspp
>>401
それ配列が空だったらエラーになるから一貫性のない頭の悪い方法
0403デフォルトの名無しさん2015/01/20(火) 07:24:19.26ID:q7S0YejK
なるか?
04044022015/01/20(火) 07:36:46.41ID:quI2Cspp
すまん勘違いだわ
頭の悪いのは俺だった
0405デフォルトの名無しさん2015/01/20(火) 07:45:02.30ID:Y4m7VuCx
m9
0406デフォルトの名無しさん2015/01/20(火) 08:14:30.35ID:tR2SZl1M
cc = 1

def bb
cc = 'A'
p cc #=> A
end

bb
p cc #=> 1

Rubyでは内外のccが、別々の変数(スコープ)となる

外側で宣言したccを、簡単に関数の内側で使いたいが、
どうすればよい?
ただし、グローバル変数以外で
0407デフォルトの名無しさん2015/01/20(火) 08:33:36.19ID:quI2Cspp
クラスを使う
簡単じゃないだろうけど避けて通れない道
04084062015/01/20(火) 08:55:45.97ID:tR2SZl1M
>>406 自己レス
cc = 1
# トップレベルで、define_methodを呼び出す
Kernel.send :define_method, :bb do

# def bb
cc = 'A'
p cc #=> A
end

bb
p cc #=> A

def bb の代わりに、
トップレベルで、define_methodを呼び出すと、
Kernel.send :define_method, :bb do

内外のccが、同一の変数(スコープ)となった
0409デフォルトの名無しさん2015/01/20(火) 10:07:56.04ID:mp2703SQ
そんなことするくらいならラムダのほうがまし
cc = 1
bb=->{
cc = 'A'
p cc #=> A
}
bb.call
p cc #=> A
04104062015/01/20(火) 11:21:08.26ID:tR2SZl1M
いや、関数の外側で定義する変数・コンテナが、
たくさんあるのよ

それらをすべて簡単に、関数の内側で使いたい
0411デフォルトの名無しさん2015/01/20(火) 11:54:53.29ID:Y4m7VuCx
この手の奴は放置で見守るに限る
04124062015/01/20(火) 12:47:13.19ID:tR2SZl1M
関数の引数に、配列を渡して変更していたら、はまった!

配列の各要素をコピーしないから、
同一の配列を変更していて、
それに気づくまで、延々とはまった

関数の中で、すべての要素をコピーすればよいのか?

def aa(ary)
xx = ary[0..-1]
end
0413デフォルトの名無しさん2015/01/20(火) 13:33:23.01ID:h23euKpJ
ついさっき同じ質問してたじゃん
ちゃんとレス読めよ
04144062015/01/20(火) 13:47:50.26ID:tR2SZl1M
配列が参照渡しというのを、すぐ忘れてしまう

関数の中で、配列を変更しないように、
気をつけているが、それもすぐに忘れてしまう。
どこかで、代入してしまう

それだけ無意識で、コーディングが速い。
無想の境地。Ruby 恐るべし
0415デフォルトの名無しさん2015/01/20(火) 13:54:47.99ID:M5BHFTcG
ここはお前のブログじゃねえっての
0416デフォルトの名無しさん2015/01/20(火) 15:33:53.92ID:e9cTGLx2
地球環境に配慮して今日中に死ね
04174062015/01/20(火) 17:24:06.78ID:tR2SZl1M
Person_ary = ('A'..'D').to_a
["A", "B", "C", "D"]
["AB", "B", "C", "D"]

ttps://paiza.io/
で実行しているが、p で表示すると、
いつの間にか配列の'A'が、'AB'に変わってしまう。
配列に代入している箇所は無い
環境のバグ?

それにそもそも、大文字で始まる変数名は、
定数じゃないのか?

トップレベルで、define_methodを呼び出して、
関数外で定義した配列を、関数内で使っているから?
さらに、この関数は再帰関数なのです

Kernel.send :define_method, :go do |
per_ary, layer=0, total_time=0 |

元の配列を変更しないように、
すべての要素をコピーして、関数に渡しているのですが、
ary2 = Person_ary[0..-1]
go(ary2)
0418デフォルトの名無しさん2015/01/20(火) 17:25:29.93ID:7ow9yZfB
他のscriptから配列を文字列として引数で渡して、
ruby上で配列として実行したいんですがうまくいきません。何か良い方法はありますか?
0419デフォルトの名無しさん2015/01/20(火) 17:45:03.42ID:q7S0YejK
>>418
ちょっと状況がよくわからない
配列を標準出力に出力するスクリプトがあってそれをRubyスクリプトで受け取りたいのか
それともRubyスクリプトに定義してある配列を他のRubyスクリプトでも使いたいのか
それともそれ以外?
0420デフォルトの名無しさん2015/01/20(火) 17:56:37.98ID:7ow9yZfB
やっぱわかりづらかったですね。すみません。
ruby側で"[[1,2],[3,4]]"という状態で受けた文字列を
そのまま配列として使いたいのですがうまくできません。
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やめて新言語かよ
とおもったら言語設計の学習向けサンプルか
■ このスレッドは過去ログ倉庫に格納されています