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

Ruby 初心者スレッド Part 50

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/07/29(日) 14:26:28.92
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0497デフォルトの名無しさん2012/11/06(火) 12:58:48.42
def f(lst)
  lst.chunk{|n|
    n == 0 ? :_separator : :num
  }.map{|_, seq|
    seq.inject(0, &:+)
  }
end
0498デフォルトの名無しさん2012/11/06(火) 16:32:16.03
>>497
:_separatorを活用してる人をものすごくひさしぶりに見た
0499デフォルトの名無しさん2012/11/06(火) 20:58:56.25
文字列と同様に、Array#splitみたいなのがあれば便利そうだ
0500デフォルトの名無しさん2012/11/06(火) 20:59:27.22
つーか chunk categorize の使い道を自分では思いつけん。
0501デフォルトの名無しさん2012/11/06(火) 21:16:49.26
今更だけど
>>494て>>490への遠回しな答えでしょ
0502デフォルトの名無しさん2012/11/07(水) 02:00:09.49
exlap.rbを利用しないで

require 'win32ole'
fso = WIN32OLE.new("Scripting.FileSystemObject")
filename = fso.GetAbsolutePathName("test.xls") #フルパス名で記録
xl = WIN32OLE.new("Excel.Application")
xl.Visible = true #Excelが動くのを見えるようにする
if test(?e, filename) #filenameが存在する場合
wb = xl.Workbooks.Open(filename)
else #filenameが存在しないので新規オープン
wb = xl.Workbooks.Add()
end
ss.Range("C2").Select #左2列と上1行を固定
xl.ActiveWindow.FreezePanes = true

だと動くのにexlap.rbを利用して

require 'exlap'
require 'win32ole'
xl = Exlap.new
filename = "test.xls"
wb = xl.book_open filename # ワークブックを開く
ss = wb.first_empty_sheet # 最初の空シートを選択
ss.Name = "論文の要約一欄" # ワークシート名を設定
ss.Range("C2").Select #左2列と上1行を固定
xl.ActiveWindow.FreezePanes = true

だと最後の行でエラーでるのはなぜですか?
0503デフォルトの名無しさん2012/11/07(水) 07:52:29.75
1.8の正規表現で
'<a href="http://www.foo.com/index.html">foo</a><a href="http://www.foo2.com/index.html">foo2</a>' ←HTMLの一部
>'http://www.foo2.com/index.html'
'n1 n2 n3 n4 n5' ←文字列の一部
>'n5'
みたいな結果を得たいのですがどのように書けば出来ますか?
[/<a href=".(+?)">foo2<\/a>/,1]
>http://www.foo.com/index.html">foo</a><a href="http://www.foo2.com/index.html
[/^.+\s(.+?)$/,1]
>n2 n3 n4 n5
となってしまいます
0504デフォルトの名無しさん2012/11/07(水) 10:16:29.74
>502
exlapだから
0505デフォルトの名無しさん2012/11/07(水) 13:09:14.63
>>504
最後の行をどう書けば動きますか?
exlapではセルの固定はできないのでしょうか
0506デフォルトの名無しさん2012/11/07(水) 13:13:10.38
exlap 使っても require 'win32ole' は変わらないんだから
exlap 使う意味なくね?
0507デフォルトの名無しさん2012/11/07(水) 15:04:26.67
>>506
このあともexlapを使うのでwin32oleを組み合わせたいのですが
まずここのエラーの理由がわからないと他のエラーも直せないのです…
0508デフォルトの名無しさん2012/11/07(水) 21:05:03.40
>>503
.*のマッチする範囲が広すぎるので、制限してやるのがポイント
""の内部で"が出現することは無いだろうから [^"]+などとしてやる

htmlsrc = '<a href="http://www.foo.com/index.html">foo</a><a href="http://www.foo2.com/index.html">foo2</a>'
p /<a\s+href="([^"]+)"\s*>\s*foo2\s*<\/a>/.match(htmlsrc)
=> #<MatchData "<a href=\"http://www.foo2.com/index.html\">foo2</a>" 1:"http://www.foo2.com/index.html">

なんでもかんでも正規表現でがんばっていた時期が私にもありました

0509デフォルトの名無しさん2012/11/07(水) 23:08:58.75
>>507
エラーメッセージもなしにエラーの理由なんて分かりません

excel持ってないからあてずっぽうだけど、
xl.objで生のExcel.Applicationオブジェクトに触れるっぽいから
exlapがラップしてないメソッド使う場合は
xl.obj.ActiveWindow.FreezePanes = true
みたいにするんじゃないか?
0510デフォルトの名無しさん2012/11/08(木) 01:32:51.06
>>503
うーん、質問の意味がわからない…
なんでいきなり
'n1 n2 n3 n4 n5' ←文字列の一部
が出てくるのか…
0511デフォルトの名無しさん2012/11/10(土) 17:52:07.72
a[b + c => d] = e
この添字の部分はどういう意味ですか?
0512デフォルトの名無しさん2012/11/10(土) 17:57:08.61
ハッシュ
0513デフォルトの名無しさん2012/11/10(土) 21:08:45.55
シングルトンってオブジェクト一つしかつくれないってことだけど
具体的になイメージがわかない。
例をだして教えてください。
0514デフォルトの名無しさん2012/11/10(土) 21:37:34.04
>>513
おれは、通し番号をつくってる
たとえば、ファイルをひらいたりとじたりしてるとき、操作したファイルの通し番号
0515デフォルトの名無しさん2012/11/10(土) 21:41:06.10
>>513
必要ないものを作ったり使ったりしてはいけません
思いつかないのなら、使おうとしてはいけません
0516デフォルトの名無しさん2012/11/10(土) 21:43:21.95
>>513
Javaには、グローバル変数がない。シングルトンを利用する。
JavaのプログラムをRubyに翻訳するとき、Rubyでもシングルトンを利用できる。
グローバル変数でもできる
0517デフォルトの名無しさん2012/11/10(土) 23:43:05.25
>>513
The earthとか、ひとつしか存在しないものを定義するとき便利。そのシステム中に一定個しか出現しないものにもいい。
0518デフォルトの名無しさん2012/11/10(土) 23:50:03.02
>>515が真理ではある…のだが、地雷踏み抜かないと成長しないというのも真理…かもしれない
本当に必要になったらわかるようになるから忘れろ、ってのもありだけどね
0519デフォルトの名無しさん2012/11/11(日) 01:02:17.84
一つしか作れないことよりも、新規生成したつもりでも既存のオブジェクトとして存在していれば、
素知らぬ顔をしてそのオブジェクトが帰ってくるのが、使い勝手が良い気がする。

複数の場所・タイミングで生成される可能性があるが、どこで作られたとしても、他の場所で使い回したい。みたいな。
生成がコピーによる生成を含めて、一カ所に閉じ込められるなら、要件としてシングルトンを満たしていても、採用する
必要は無いかなと思う。
0520デフォルトの名無しさん2012/11/11(日) 01:16:34.15
GoFでいうFlyweightとSingletonを組み合わせるパターンはしばしば出現する

ファクトリの部分にキャッシュを入れて、
かつファクトリ自体が一つであることを保証しようとすると
勝手にそうなる
0521デフォルトの名無しさん2012/11/11(日) 15:10:16.37
>>499
ホイ

class Array
def arsplit(pattern)
# pattern = regexp, string or number
result = []
result << []
self.flatten.each do |elm|
if pattern === elm
result[-1] != []? result << [] : false
else
result[-1] << elm
end
end
result[-1] == []? result.pop : false
result
end
end
0522デフォルトの名無しさん2012/11/11(日) 15:11:17.94
>>521の続き

[1,2,3,0,5,5,0,2,4,6,0].arsplit(0)
=> [[1,2,3],[5,5],[2,4,6]]
[1,2,3,0,5,5,0,2,4,6,0].arsplit(0).map{|ar| ar.inject(:+)}
=> [6,10,12]

" hoge hage hige ".split("")
=> [" ", " ", " ", "h", "o", "g", "e", " ", " ", "h", "a", "g", "e",
" ", " ", " ", " ", " ", " ", "h", "i", "g", "e", " ", " ", " "]
" hoge hage hige ".split("").arsplit(/&yen;s/)
=> [["h", "o", "g", "e"], ["h", "a", "g", "e"], ["h", "i", "g", "e"]]
0523デフォルトの名無しさん2012/11/11(日) 20:17:57.17
なんか冗長だなぁ…
0524デフォルトの名無しさん2012/11/11(日) 21:36:16.49
[:a,:b,:c,:d,:e,:f][0,3,5]
=> [:a, ;d, ;f]
という感じで複数の添字で引っこ抜くのできないの?


a = [:a,:b,:c,:d,:e,:f]
[a[0], a[3], a[5]]
でもいいけどマンドクセ
0525デフォルトの名無しさん2012/11/11(日) 22:13:42.89
>>524
Array#values_at
0526デフォルトの名無しさん2012/11/11(日) 23:01:11.51
>>522 >>525
values_at とか inject は知らなかった
使えそう

自分←不勉強
0527デフォルトの名無しさん2012/11/13(火) 14:33:49.47
1.8.7 から 1.9 への移行したい。
どこかに注意点のまとめがあったはずなんだけど見つからない。
0528デフォルトの名無しさん2012/11/13(火) 15:13:58.58
自己解決
10 things to be aware of in moving to Ruby 1.9
http://dablog.rubypal.com/2009/1/14/10-things-to-be-aware-of-in-moving-to-ruby-1-9
http://jp.rubyist.net/magazine/?0025-FirstStepRuby191
0529デフォルトの名無しさん2012/11/13(火) 16:31:02.80
http://d.hatena.ne.jp/takehikom/20090129/1233169748
>2行目に「# -*- coding: utf-8 -*-」(マジックコメント)を書きましょう。

1行目に
#coding: utf-8
とか書くのはダメ?
-*- は emacs 用とかじゃなくて
0530デフォルトの名無しさん2012/11/13(火) 18:16:39.38
>>529
おk
0531デフォルトの名無しさん2012/11/13(火) 18:17:00.55
Rubyとして意味はなくても装飾はつけといたほうがよいということになってる
すくなくともEmacsの簡便な動作には必要なものなので、それに相乗りして「なんか余計なの書いてあったから消した」を防ぐ効果が期待できる
Emacsを使ってるか、すくなくとも知っていればこの行を消すことはないはず
0532デフォルトの名無しさん2012/11/13(火) 18:30:45.74
> Rubyとして意味はなくても装飾はつけといたほうがよいということになってる

どこで推奨されてましたっけ?
0533デフォルトの名無しさん2012/11/13(火) 19:41:26.88
>>532
これ、私も知りたい
0534デフォルトの名無しさん2012/11/13(火) 19:46:28.22
本当にRubyにマジックコメントは必須だったのだろうか
どのエンコードか指定するのはもちろん良いとして
書かなくても自動判別できるようにするべきだったのでは
0535デフォルトの名無しさん2012/11/13(火) 19:49:48.31
require 'AutoEnc'
0536デフォルトの名無しさん2012/11/13(火) 20:35:57.67
>>534
1万行あるスクリプトファイルの、最後の行にだけぽつんと日本語が使われてる、とか、
EUCかシフトJISか判別不可能なオクテット列しか現れない、とか、
そういう嫌なケースがいくらも思いつく。
0537デフォルトの名無しさん2012/11/13(火) 21:39:28.19
自動判別は誤爆のほうが多いし、たとえばShift_JIS/CP932とLatin-5あたりの区別は技術的に困難
Latinの中でどのLatinかを判別するのも出現頻度と辞書頼りで根本的に誤爆上等
文字エンコーディングは「最初にファイルを書いた人」が"絶対に知っている"はずなので、
わざわざ電気代と時間をかけて推測して当たりか外れかドキドキするよりもその人に確かな情報を教えてもらうのがコスト的にベスト

テキストファイルは本来、最低限、文字エンコーディング情報をファイル中またはファイル付随で持つべきだった
…そんな「エンコーディング形式」なんて概念が不要だった時代からの遺産だから仕方がないんだけど
05385292012/11/13(火) 21:40:50.28
>>530
ありがと

いま自分のスクリプトをみたら
> #coding: Windows-31J
> $KCODE='s'
とか
> #coding: utf-8
> $KCODE='u'
> # あ utf8
って書いてあったんだけど、
これって移行期を考えて書いてあったのかな?
って他人に聞く話ではないなw

obj.method{ |arg| ... } の arg がブロックローカルに
なることにビビった。
とりあえず、each_with_index とか times あたりが怪しいので
全部調べた。やっぱりヤバイのあった。疲れた。_| ̄|○
0539デフォルトの名無しさん2012/11/13(火) 22:29:56.10
ST2最強や
emacsなんていらんかったんや!
0540デフォルトの名無しさん2012/11/13(火) 23:04:16.16
先端開発版だと、デフォルトのソースエンコーディングがUTF-8になったようですが
2.0はそれで決定なんですかね?
0541デフォルトの名無しさん2012/11/13(火) 23:16:22.22
それと String#bメソッドでエンコーディングをASCII-8BITに出来るそうですが
やっぱりリテラルもあったほうがいいと思うんですけどね
%u() と %U() でUTF-8のリテラル
%b() と %B() でASCII-8BITのリテラル
みたいな

さらに贅沢を言えば、Windows用に\をエスケープしないリテラルが欲しいですな
"""ほげほげ\ほげほげ\ほげほげ\"""的なやつか、%記法で
0542デフォルトの名無しさん2012/11/14(水) 01:28:05.21
つーかいまどきutf-8以外使ってる方が悪いんだから
utf-8使ってる限りは変なコメント書かせずに良きに計らってくれよっていうね
0543デフォルトの名無しさん2012/11/14(水) 12:01:20.43
>テキストファイルは本来、最低限、文字エンコーディング情報をファイル中またはファイル付随で持つべきだった
>…そんな「エンコーディング形式」なんて概念が不要だった時代からの遺産だから仕方がないんだけど

Appleはエロいよ
0544デフォルトの名無しさん2012/11/14(水) 12:33:22.64
Windows Ruby1.9.3p286です
if a then
p "true"
end
って書くと"true"って表示されますが
if a == true then
p "true"
end
って書くと表示されません

Rubyではifのfalseとnil以外は真になるのに撫ぜa==trueが偽になるのでしょうか?
あとifはthenを省略かけるのですが、業界的には省略するのとしないのどっちが当たり前でしょうか?
0545デフォルトの名無しさん2012/11/14(水) 13:10:56.91
a が 1 とか 2 とか bool じゃないならそうなる
要するにあんた Perl に毒され杉だよってこと
0546デフォルトの名無しさん2012/11/14(水) 13:41:29.40
一瞬、「a が 1 とか 2 とか bool 」だったらa==trueがtrueになるのかと思った
あいまいな日本語はよくないぞ
0547デフォルトの名無しさん2012/11/14(水) 13:52:04.10
気付いたけど敢えて直さなかった
今は反省していない
0548デフォルトの名無しさん2012/11/14(水) 14:06:28.19
例えば1とか2のように、aがboolではない場合そうなります
つまり、あなたはPerlの感覚にとらわれすぎているということです
0549デフォルトの名無しさん2012/11/14(水) 14:35:35.53
>>531は結局寝言?
0550デフォルトの名無しさん2012/11/14(水) 14:50:36.89
世の中、Emacs中心に物事が回っている。そういうことだ
0551デフォルトの名無しさん2012/11/14(水) 16:34:00.50
a.rb の中身

# coding: Windows-31J
$KCODE='s'
doc=<<'EOD'
こんにちは
世界
EOD
p doc

a.rb の出力 1.8 では

"こんにちは\n世界\n"

になっていたけど、1.9 では

"こんにちは\r\n世界\r\n"

になったりしますか?

# ブロックパラメーターの確認と修正オワタ 疲れた・・・
0552デフォルトの名無しさん2012/11/14(水) 18:08:16.08
binmode と同じか
0553デフォルトの名無しさん2012/11/14(水) 20:15:14.51
resolv、net-dns、dnsrubyといくつかあるけどどれが主流ですかね
それぞれの違いとかどんなものなのか知りたいのだけど資料もあまり多くはないな
0554デフォルトの名無しさん2012/11/15(木) 08:51:04.61
Ruby 1.9x irbでの環境で実行していて、
16進文字コードと、正規表現の入力チェックに
関して質問したいことが出ました。
"0123456789" =~ /&yen;A&yen;d+&yen;z/u
=> 0
こういう入力チェックをしている状況で、
たとえば先頭の0を16進表記しても
"&yen;x30123456789" =~ /&yen;A&yen;d+&yen;z/u
=> 0
という風になります。
'&yen;x30123456789' =~ /&yen;A&yen;d+&yen;z/u
=> nil
一方、式展開をさせないシングルクォートだと
こうなります。
irb以外の、ブラウザからの
postやgetされた16進表記などの入力値は、
どういう風に処理されるのでしょうか
&yen;x30はrubyで処理するときにはもう既に
展開されて0になっているのか、などです。
それとも処理系やブラウザ依存でしょうか。
0555デフォルトの名無しさん2012/11/15(木) 08:53:12.80
Ruby 1.9x irbでの環境で実行していて、
16進文字コードと、正規表現の入力チェックに
関して質問したいことが出ました。
"0123456789" =~ /\A\d+\z/u
=> 0
こういう入力チェックをしている状況で、
たとえば先頭の0を16進表記しても
"\x30123456789" =~ /\A\d+\z/u
=> 0
という風になります。
'\x30123456789' =~ /\A\d+\z/u
=> nil
一方、式展開をさせないシングルクォートだと
こうなります。
irb以外の、ブラウザからの
postやgetされた16進表記などの入力値は、
どういう風に処理されるのでしょうか
\x30はrubyで処理するときにはもう既に
展開されて0になっているのか、などです。
それとも処理系やブラウザ依存でしょうか。
0556デフォルトの名無しさん2012/11/15(木) 08:56:09.86
>\x30はrubyで処理するときにはもう既に展開されて0になっているのか
いいえ
>処理系や
いいえ
>ブラウザ依存
いいえ
0557デフォルトの名無しさん2012/11/15(木) 08:56:33.08
> &yen;
(マカーだ…)
(マカーが来たわ…)
0558デフォルトの名無しさん2012/11/15(木) 11:32:51.71
rubyでwinndowsのプログラムはつくれますか
0559デフォルトの名無しさん2012/11/15(木) 12:33:39.08
yesかnoかで言えばyes
茨の道だからお薦めはしない
LLでやりたいってことなら
Pythonの方がWindowsと相性良い
0560デフォルトの名無しさん2012/11/15(木) 13:10:18.99
ありがとうございます
0561デフォルトの名無しさん2012/11/15(木) 16:25:01.43
ttp://www.kkaneko.com/rinkou/ruby/kanjicode.html
>日本語文字コードの変換
>【要点】
>Ruby バージョン 1.9 以降: String::encode を使う
>Ruby バージョン 1.8 以下: NKF を使う

1.9 でも、NKF を使っていてもいいんでしょ?
0562デフォルトの名無しさん2012/11/15(木) 18:25:56.63
>\x30はrubyで処理するときにはもう既に展開されて0になっているのか
はい
0563デフォルトの名無しさん2012/11/15(木) 20:41:02.78
まずはここに接続
サーバー chat.na1.lol.riotgames.com
ポート 5223
SSL使用


接続したあと pvp.netに認証↓
ドメイン pvp.net
ID tarou
PASS test
resource xiff

これをXMPPで送信したいんですけどRubyでやる方法教えてください
0564デフォルトの名無しさん2012/11/15(木) 20:41:50.02
http://stackoverflow.com/questions/13375021/how-to-authentication-league-of-legends-pvp-net-xmpp-help

これをRubyに書き直してください
じゃあ
0565デフォルトの名無しさん2012/11/15(木) 20:49:25.27
汚いトロルだなあ
0566デフォルトの名無しさん2012/11/16(金) 08:52:30.95
>>556
>>562
あざまっす処理系やブラウザには依存しない、
でOKのようですね。
>&yen;x30はrubyで処理するときにはもう既に展開されて0になっているのか
ここについてはご意見違うようですが。
httpの通信の部分ですよね。
0567デフォルトの名無しさん2012/11/16(金) 09:15:29.92
>>557
知ってるかもしれませんが、
ローカルでirbやったりすると
Windowsと比較にならないくらい
実行が早いっすよ。

MacBookAirはスタバでドヤ顔のためでもなく
デザイナーのためでもなく、
エンジニアのノマド開発用だとおもいます。
0568デフォルトの名無しさん2012/11/16(金) 09:37:02.24
なぜ比較対象がWindowsなんだろう
0569デフォルトの名無しさん2012/11/16(金) 11:19:22.83
>567
Window8があまりにひどいので
次買い換えるときはMacにするかも知れない
楽しみに待っててね!
0570デフォルトの名無しさん2012/11/16(金) 11:33:04.35
>>568
5年前くらいの頭で止まってるとそうなる
Windows7マシンにCUIなLinuxをVMで入れるのがコスパと使い勝手の総合で現状最強

※ コスパを入れ忘れないように願います
0571デフォルトの名無しさん2012/11/16(金) 12:48:33.42
andLinux いいよね
0572デフォルトの名無しさん2012/11/16(金) 17:35:15.04
def change(hash)
 hash.merge!(key: "change")
end

h = {key: "value"}
change(h)
h[:key] # => "change"

となるのに、rspecで
it do
 h = {key: "value"}
 change(h)
 h[:key].should == "change"
end
とすると
expected: "change"
got: "value" (using ==) となってしまいます。
なにが間違っているんでしょうか。
0573デフォルトの名無しさん2012/11/16(金) 23:00:19.56
>>572

method(:change) を出力してみると分かるかもしれないけど、
RSpecが定義しているマッチャーメソッドに change がある。

expect { operation }.to change(:hoge).from(X).to(Y)

のように使う奴。

別の名前のメソッドにすれば期待通りに動く。
0574デフォルトの名無しさん2012/11/17(土) 01:54:35.18
ありがとうございます。
無事動作しました!
0575デフォルトの名無しさん2012/11/17(土) 06:10:57.41
S式のファイルをパースしてHashにしたいんだけどライブラリとかないかな?
0576デフォルトの名無しさん2012/11/17(土) 18:28:26.52
>>570
無料の中では、Linux良いよね。
0577デフォルトの名無しさん2012/11/17(土) 18:37:11.81
>>575
どれほど堅牢かは知らないけどRipper.sexpや
https://github.com/aarongough/treetop-sexp-parser

いっそのことLLスレにお題として持ち込んでみてほしい
0578デフォルトの名無しさん2012/11/17(土) 18:51:06.19
hashにしたい人なんて居ないだろうから無いだろう。
0579デフォルトの名無しさん2012/11/17(土) 20:56:36.01
Hashじゃなかった。Arrayだった。
>>577は少し試してみたけど使えそう。
ってか、基本rubygemsしか探さないから気づかなかったわ。
ありが�d
0580デフォルトの名無しさん2012/11/18(日) 04:57:48.10
>573
なんで名前空間分かれてないの?
0581デフォルトの名無しさん2012/11/18(日) 05:02:48.19
DSLだから
ユーザーはキーワードを事前にすべて把握「していなければならない」
これはDSL使用における不可避な義務

assertというメソッド作ったらぶっ壊れるのと同じ
0582デフォルトの名無しさん2012/11/18(日) 19:38:46.37
Ruby1.9.3のマニュアルのsucc -> Timeについて
http://doc.ruby-lang.org/ja/1.9.3/class/Time.html

t = Time.now
p t
p t.succ
を実行するとwarning: Time#succ is obsolete; use time + 1って警告が出ます。
p t + 1と書けということなんでしょうが、succは1.9.3では非推奨なんですか?
将来のバージョンではsuccは消えるってことでしょうか?
0583デフォルトの名無しさん2012/11/19(月) 10:20:22.30
Rubyで、ブロックパラメータの構文木って取得できない?
foo {|x| x == nil ? 1 : 0 }
みたいな関数呼び出しがあったとして、foo()が受け取ったブロックの中身を構文木として取り出してごにょごにょしたい。
0584デフォルトの名無しさん2012/11/19(月) 10:56:29.33
exerb のソース見ると良いよ
0585デフォルトの名無しさん2012/11/19(月) 14:11:23.12
>>584
できないってことか。
0586デフォルトの名無しさん2012/11/19(月) 14:15:17.75
そこに書いてある
0587デフォルトの名無しさん2012/11/19(月) 19:15:08.83
>>583
Rubyの標準機能ではできない。たしかRubiniusならできたような。

>>584
exerbはソースコードをパースしてるだけなんじゃないの?583がやろうとしているのはそうじゃないでしょ。
0588デフォルトの名無しさん2012/11/20(火) 15:37:59.31
最近ようやくrvmに手を出したものです。環境はOSX10.8です。現状は
$ rvm list
rvm rubies
=* ruby-1.9.3-p194 [ x86_64 ]
# => - current
# =* - current && default
# * - default
which rubyだと
/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby
$ ruby --version
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.2.0]
です。
0589デフォルトの名無しさん2012/11/21(水) 20:49:38.11
ものすごい初歩的なミスだと思うのですが助けて!

環境 ruby1.8 windows7

# 配列を作成
ary = [
[1, "aさん", "[email protected]"],
[2, "bさん", "[email protected]"],
[3, "cさん", "[email protected]"],
[4, "dさん", "[email protected]"]
]

require "CSV"

file = CSV.open("hoge.csv", "w", "\t", "\n")
ary.each { |row| file << row }


配列をタブ区切りCSV?に出力するコードに、
↓な感じでダブルクォーテーションをつけようとしたんだけどエラーが出るんです。

file = CSV.open("hoge.csv", "w", "\t", "\n", {:force_quotes=>true})

エラーメッセージ
C:/AptanaWorkspace/Hello2/array2.rb:13:in `open': wrong number of arguments (5 for 4) (ArgumentError)
from C:/AptanaWorkspace/Hello2/array2.rb:13

↓にするとダブルクォーテーションは付くんだけど、区切りの文字はないし改行もされないです
file = CSV.open("hoge.csv", "w", "", {:force_quotes=>true})
0590デフォルトの名無しさん2012/11/21(水) 20:51:32.91
↓にするとまたエラーがでます
file = CSV.open("hoge.csv", "w", "\t", {:force_quotes=>true})

エラーメッセージ
c:/ruby/lib/ruby/1.8/CSV.rb:492:in `index': type mismatch: Hash given (TypeError)
from c:/ruby/lib/ruby/1.8/CSV.rb:492:in `generate_body'
from c:/ruby/lib/ruby/1.8/CSV.rb:288:in `generate_row'
from c:/ruby/lib/ruby/1.8/CSV.rb:692:in `<<'
from C:/AptanaWorkspace/Hello2/array2.rb:16
from C:/AptanaWorkspace/Hello2/array2.rb:16:in `each'
from C:/AptanaWorkspace/Hello2/array2.rb:16


csv.rbを覗いてみると83行目が↓になっててパラメータを5つ渡せるように見えるのですが
最後の&blockはパラメータではないのでしょうか?
def CSV.open(path, mode, fs = nil, rs = nil, &block)
0591デフォルトの名無しさん2012/11/21(水) 20:59:24.16
>>590
&amp;block はブロックなのでここの open の上の方のように書きます
ttp://doc.ruby-lang.org/ja/1.8.7/class/CSV.html
0592デフォルトの名無しさん2012/11/21(水) 22:16:59.39
>>591
どこを見ればいいのかわかりませんorz

{:force_quotes=>true}をどこらへんに書けばいいのでしょうか
0593デフォルトの名無しさん2012/11/21(水) 22:49:44.82
>>590
1.8じゃそんなオプションないとかじゃないの?
適当にリファレンス見てみると
http://doc.ruby-lang.org/ja/1.8.7/class/CSV.html こっちはforce_quotesなんて見つからないけど
http://doc.ruby-lang.org/ja/1.9.2/class/CSV.html 1.9だと普通に書いてあるし
0594デフォルトの名無しさん2012/11/21(水) 23:00:10.21
1.9ではFasterCSVが標準のCSVとして採用されたんじゃなかったかな
1.8にFasterCSV入れれば同じように使えるかと
0595デフォルトの名無しさん2012/11/22(木) 00:12:46.16
>>593
file = CSV.open("hoge.csv", "w", "", {:force_quotes=>true})

これだと一応ダブルクォーテーションは付いたので、対応してるのかなと思いましたが、
1.9からの機能かも知れないのですね

1.8にFasterCSV入れるか1.9でやってみます!
0596デフォルトの名無しさん2012/11/22(木) 18:34:41.52
初心者スレに逝けよ
■ このスレッドは過去ログ倉庫に格納されています