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

Ruby 初心者スレッド Part 30

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/08/08(土) 08:21:23
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0213デフォルトの名無しさん2009/08/18(火) 21:08:14
6年前のな
0214デフォルトの名無しさん2009/08/18(火) 21:17:36
MeCab本体とMeCabライブラリは違う
0215デフォルトの名無しさん2009/08/18(火) 21:25:58
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError)
Possible C/C++ prototypes are:
Tagger.new(char const *argc)
Tagger.new()

少しいじった結果エラーログがこうなりました・・。
これはスクリプト書き換えとかで回避できないんでしょうか?
02162032009/08/18(火) 21:30:24
>>205->>206,>>208さんのもの自体は理解できたのですが,
やはり>>209での問題が解決しませんでした.
ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.
0217デフォルトの名無しさん2009/08/18(火) 21:57:11
どんな値が返ってくれば正解なのかすら知らせずに丸投げとな

require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new
ary.size.times do |i|
b = ary[i + 1, window].delete_if{|w| /#{ary[i]}/ =~ w}
b.each do |w|
hout[w] = 0 unless hout[w]
hout[w] += 1
end
end
pp hout


{"w1"=> 10, "w2"=> 9, "w3"=> 11, "w4"=> 9, "w5"=> 6}
0218デフォルトの名無しさん2009/08/18(火) 22:02:04
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new
ary.size.times do |i|
ary[i+1, window].each do |w|
next if /#{ary[i]}/ =~ w
hout[w] = 0 unless hout[w]
hout[w] += 1
end
end
pp hout
0219デフォルトの名無しさん2009/08/18(火) 22:28:25
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new(0)
ary.size.times do |i|
ary[i+1, window].reject{|w| w == ary[i]}.each{|w| hout[w] += 1}
end
pp hout
02202032009/08/18(火) 22:30:53
>>217->>218
すいません。欲しい出力を書いていませんでした。申し訳ありません。


{"w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
"w2"=>{"w1"=>4, "w3"=>5, "w4"=>2, "w5"=>1},
"w3"=>{"w1"=>4, "w2"=>2, "w4"=>3, "w5"=>2},
"w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w5"=>1},
"w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1}}
と出力して欲しいのです。
0221チンパンジー愛ちゃん2009/08/18(火) 23:01:40
require 'pp'

def hash_add(base, add)
ret = add.each do |nest_key, nest_value|
if base[nest_key]
nest_value.each do |add_key, add_value|
base[nest_key][add_key] += add_value
end
else
base[nest_key] = nest_value
end
end
return base
end

h1 = {
"ja"=>{"a"=>5,"b"=>7,"c"=>9},
"usa"=>{"a"=>4,"b"=>2,"c"=>1}
}
# $(B$H$J$C$F<!$K(B
h2 = {
"ja"=>{"a"=>3,"b"=>8,"c"=>4},
"usa"=>{"a"=>14,"b"=>8,"c"=>5}
}
# $(B$,=P$?$i(B
pp hash_add(h1, h2)

# h1.inspect
h = {
"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>1,"b"=>1,"c"=>0}
}
0222デフォルトの名無しさん2009/08/18(火) 23:07:58
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
 (hout[key] = zero.dup).delete(key) unless hout.key?(key)
 ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
end
0223チンパンジー愛ちゃん2009/08/18(火) 23:25:03
核と思われる部分だけを抜き出すとこんなことになるんだけど、
問題をうまくまとめれてないんじゃない?
もうちょっと整理してから再度質問して。

require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6

ary.size.times { |i|
j = i + 1
p [":ary[#{j},#{window}]", ary[j, window]]
}
t217.3.rb [utf-8][unix]
:!ruby t217.3.rb
[":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]]
[":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]]
[":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]]
[":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]]
[":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]]
[":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]]
[":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]]
[":ary[8,6]", ["w5", "w2", "w3", "w4"]]
[":ary[9,6]", ["w2", "w3", "w4"]]
[":ary[10,6]", ["w3", "w4"]]
[":ary[11,6]", ["w4"]]
[":ary[12,6]", []]
0224チンパンジー愛ちゃん2009/08/18(火) 23:25:52
ary[12, 6]がおかしいと思わない?
02252032009/08/18(火) 23:44:32
>>221->>224
ありがとうございます。

hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と
同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。

mergeの方法は>>205-206,>>208さんのやり方になるのかなと思ってます。

>>224
ary[12,6]はそれでもOKだと思ってます。
そこは加算しなくていいよーということで。だめなんでしょうか?
0226チンパンジー愛ちゃん2009/08/18(火) 23:45:41
>>215
@mecab = MeCab::Tagger.new([$0])
ってかいてあるところに
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
みたいな感じで直接Mecab用のオプション書けばうまくいくよ
0227チンパンジー愛ちゃん2009/08/18(火) 23:53:51
>>225
ary[12, 6]をきちんと認識しているのなら何も問題はないでふ
ただ、ここがバグの原因じゃないかな?と思っただけで。

Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、
h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
以下のコードの実行結果の予想つく?

h0 = Hash.new(0)
hash = {}
p h0[:unknown_keh0 = Hash.new(0)
hash = {}
p h0[:unknown_key]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
y]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
0228チンパンジー愛ちゃん2009/08/18(火) 23:55:27
上のはゴミコードが入っちゃった。ごめん。
こっちのコードの実行結果の予想つく?

h0 = Hash.new(0)
hash = {}
p h0[:unknown_key]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
0229チンパンジー愛ちゃん2009/08/18(火) 23:57:18
rails仙人やーい
0230デフォルトの名無しさん2009/08/19(水) 00:04:07
>>228
0
5
0
5
では・・・・ないんですか?すいません。
あと:unknownという表記になれていませんのでそこがわかりません。
0231デフォルトの名無しさん2009/08/19(水) 00:10:07
windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。
No such file or directory - .\/log.txt (Errno::ENOENT)
このようになります。

ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。
その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか
0232デフォルトの名無しさん2009/08/19(水) 00:14:36
>>226

@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
と書いてみましたが・・。

何を見て何のオプションを書き加えていけばいいんでしょうか・・?
0233デフォルトの名無しさん2009/08/19(水) 00:16:04
>>231
原因がわかってるように見えるので、むしろ何がわからないのかわかりません
適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど
0234チンパンジー愛ちゃん2009/08/19(水) 00:16:39
>>230

:aaaとかはシンボルっていうんだけど、
シンボルが難しいんならいいや以下のコードで考えて。

h0 = Hash.new(0)
hash = {} # Hash.new と等価
p h0["unknown_key"]
p h0["unknown_key"] += 5
p hash["unknown_key"]
p hash["unknown_key"] += 5

実行結果の予想は間違ってるよ。
0
5
nil
h.rb:6: undefined method `+' for nil:NilClass (NoMethodError)

自分で確認してね。

あとさ、Hash.newの挙動が分かってないので、Hashの初期化について学んで来てください。
0235デフォルトの名無しさん2009/08/19(水) 00:16:56
>>231
それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う
でなければよほど面倒なことをしてるソースか

どちらにせよソース提示が必要かと
0236チンパンジー愛ちゃん2009/08/19(水) 00:27:23
>>232
ええーっ!
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
ってほんとうに実行したの?
argの意味が分からない系のヒトなのか
チンパンジー愛ちゃんでもできたのにねー

まあ、いいや。
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。

# 個人的な興味として何でghotiなんて使おうと思ったの?
0237チンパンジー愛ちゃん2009/08/19(水) 00:28:38
追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。
02382032009/08/19(水) 00:30:44
>>234
ありがとうございます。シンボルですか。了解です。

h0 = Hash.new(0) #ハッシュh0を作り初期値は0
hash = {} # Hash.new と等価 #ハッシュhashを作成(ハッシュの箱を作っただけ)
p h0["unknown_key"] #h0のkeyをunknown_keyとしてそのvalueを出力->初期値0
p h0["unknown_key"] += 5#↑のkeyのvalueに5加算
p hash["unknown_key"] #hashのkeyをunknown_keyとしてそのvalueを出力->でも中身が入ってないからnil
p hash["unknown_key"] += 5 #↑中身がわかってないのに5たしてんじゃねーよ

ということですね。少しわかりました。
02392312009/08/19(水) 00:30:53
エラーの行は
from ******.rb:444:in `open'
from ******.rb:444:in `store_text'

def store_text(lines)
ary = []
lines.each do |line|
ary << line.gsub(/\s+/, ' ').strip  ←ココ 444行目
end

ary.each do |line|
@text << line
end

File.open(@text_filename, 'a') do |fp|
ary.each do |line|
line.chomp!

fp.puts line
end


02402312009/08/19(水) 00:31:59

from ******.rb:239:in `memorize'

def memorize(lines)
@dic.store_text(lines)  ←ココ239行目
if @dic.learn_from_text
@dic.save_dictionary
end
end


from ******.rb:779 

require 'readline'   ←779行目
****** = ******.new(".\\")
puts "Welcome to The ******"

while (str = Readline.readline("> ", true))
break if /^(exit|quit)?$/.match(str)

******.memorize(str)
res = ******.talk

puts res
end

******はファイル名です。
0241デフォルトの名無しさん2009/08/19(水) 00:37:06
>>236

OS Ubuntu9.04
ruby 1.84
mecab 0.97

インスコ方法とかは
ttp://d.hatena.ne.jp/shohu33/20090216/1234781661このページを参考に。というより、コピペでコンソールに張り付けて実行してインスコしていきました・・。
rubyなどは全部apt-getです。

ghotiでtwitter用のBOT作るんだ><
0242デフォルトの名無しさん2009/08/19(水) 00:38:20
>>231=>>239-240
@text_filename
この中身をセットしている所をチェックしてみれば?

もしくは単純に、
File.open(@text_filename, 'a') do |fp|
の直前で、
p @text_filename
してみるとか。
まあごっつい原始的なデバグ法で気が引けるが。
0243デフォルトの名無しさん2009/08/19(水) 00:41:00
人工無脳流行ってんの?

>>240
その*****とやらのクラスのinitializeの第一引数どうなってる?
>****** = ******.new(".\\")
の .\ に log.txt を結合してるんだと思う
02442422009/08/19(水) 00:42:50
>>243
をお。
ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ
02451952009/08/19(水) 00:49:25
流れをぶったぎってすみません。ちょっと質問。

配列のデフォルト値の指定ってできますか?
ハッシュ(デフォルト値==0)だったら hoge = Hash.new(0)だけど
配列は同じ構文で要素数指定になりますよね。

ary = []
ary.default(0)
ary[3] #=> 0

みたいなことがやりたいのです。
02462312009/08/19(水) 00:51:06
def initialize(dirname)
def initialize(dirname=nil)
def initialize(buf)
def initialize(ary=nil)

第一引数がわかりません><

ruby難しいですorz
0247チンパンジー愛ちゃん2009/08/19(水) 00:51:50
>>239
なんだー?それは。
ghoti.rbが実行できないわけではないのか。
ココ444行目とかかかれても何のエラーか分かんねーよ。
どーせnilがsub呼んだってエラーだろーけどなー
239行目は分からない、でも@dicをみるにmecabの辞書をインストールしてないんでしょ。
779行目はreadlineっていうライブラリがないってだけでしょ。

で、そういうライブラリなし・辞書なしとかのエラーだと予想したからこそ、
>>236-237の
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。

追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。

って質問を書いておいたんだけどな。
どうやってインストールされていたか分からないなら分からないと正直に書いて。
とりあえず答えてくれれば解決方法を伝えるようにがんばるけど答えないなら知らない。諦めてね。

>>203(208)
>>227で愛ちゃんが書いた以下のコードを理解してもらいたくって
>>228, >>234を書いたってことを理解してね。
-------------------------------------
Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
0248チンパンジー愛ちゃん2009/08/19(水) 00:53:11
およよ、書かれてた。ごめんね。
リロードせずに書いちゃった。
>>247はとりあえずキャンセル
0249チンパンジー愛ちゃん2009/08/19(水) 00:59:00
質問者が入り乱れてて分け分からなくなってきた。
チンパンジーの限界か!
>>232の質問の続きだと思って>>239のレスに答えてた。
>>232には>>247で悪いことをした。ごめんね
0250デフォルトの名無しさん2009/08/19(水) 01:00:32
愛ちゃんかわいいよ愛ちゃん
てかコテハンうぜぇw
02512312009/08/19(水) 01:09:23
****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・
02522312009/08/19(水) 01:10:30
むりですね。。
0253デフォルトの名無しさん2009/08/19(水) 01:14:25
>>251-252
なんか吹いた

******.new (".\\")
のコード(initialize)を出せって言われとろーがwww

大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
0254チンパンジー愛ちゃん2009/08/19(水) 01:15:11
>>247
何でUbuntu9.04にruby1.84が入っているんだ。
私も9.04使ってるけどruby1.87が入ってたけどな。
それとリンク先はpythonの説明だったぞ。
なぜruby使いにpythonの記事を読ませた!死罪也!

まさかとは思うけど、pythonとrubyの区別がついてなくて
リンク先の記事はrubyの解説だと思っているってことはないよね?

@mecab = MeCab::Tagger.new
って実行してエラーメッセージを貼ってね。
個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。
あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
02552312009/08/19(水) 01:25:16
>>253
******は同じ文字列です。。
コードのだしかたが・・。

module ******
def ******.new(*args)
******::Core.new(*args)
end
def ******.init_dictionary(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.learn_from_text(true)
dic
end

class Dictionary
TEXT_FILENAME = '******.txt'
DIC_FILENAME = '******.dic'
def Dictionary.load(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.load_dictionary
dic
end
こうですか?わかりません><
02562032009/08/19(水) 01:25:22
>>247
>Hash.new(0)
>してあるんだから、
>「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
>は、h["unknown_value"] += unknown_value_key
>と直接書けばよいでしょ。

すいません。ここが理解できてないです。
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
pp hin
puts "@@@"
pp hout
puts "@@@"
}
pp hout
-------
hout[ary[i]] += hin.valuesだとhoutは初期値がないから
undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
0257デフォルトの名無しさん2009/08/19(水) 01:27:53
>>255
おk。わかった。
とりあえず、>>231に戻って
******.new (".\\")
を
******.new (".")
にしてみろ。
それでダメなら、ちゃんとソース嫁。
02582312009/08/19(水) 01:29:39
>>257

ネ申


ありがとうございます。ありがとうございます。
0259デフォルトの名無しさん2009/08/19(水) 01:34:02
>>258
怖い、怖いよw

本当にそれでいいか、一度ソースを読むことを激しくお勧めする。
てかRubyほとんど関係ねえ!
0260デフォルトの名無しさん2009/08/19(水) 01:37:44
>>259
文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。
あとはPerlでの作業なのでなんとかなるでしょう。。
Ruby難しいです・・。ソース読めません・・。
0261デフォルトの名無しさん2009/08/19(水) 01:42:18
>>203
>>222だけどあれじゃだめなの?それとも途中経過の出力が必要?

ary.each_with_index do |key,i|
 (hout[key] = zero.dup).delete(key) unless hout.key?(key)
 ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
pp hout[key],'@@@',hout,'@@@',
end
pp hout
02622032009/08/19(水) 01:47:10
>>222
ありがとうございます。出力結果はOKですし、ソースも読解します。
でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので
チンパンさんに教えてもらっている感じです。
0263チンパンジー愛ちゃん2009/08/19(水) 01:57:45
>>256
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」

以下の時にA.B.と分けて考えよう。
h1 = hash.new(0)
h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可
h2 = {"a" => 3, "c" => 8}

A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算
B.なければmergeする

A.これは、以下のままでよいから特に難しくないね。
h1["a"] += h2["a"]

B.は
h1["c"] += h2["c"]
と等価なんだよね。

p h1["unknown_key"] += 5
を思い出してね。

すると、A.Bの時に場合分けは特に必要なく、
h["unknown_value"] += unknown_value_key
のコードで事足りるよね。
02642032009/08/19(水) 02:16:49
>>263
A,Bの場合分けが入らないのは理解しました。
h["unknown_value"] += unknown_value_key
これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか?
アンダースコアをどのように使っているかわかりません。

hout[ary[i]] とやらないと
w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}
のw1=>が得られないと思っているのですが、それもちがいますか?

02652312009/08/19(水) 02:19:29
else

chr = /./m.match(str)[0]
result << chr if num
str = Regexp.last_match.post_match
end

この部分で ぬるぽ って言われるんですが。
NilClass (NoMethodError)

単なる文法間違いですか・・?
0266デフォルトの名無しさん2009/08/19(水) 02:19:39
>>262
「自分で書いた」ってのは>>209の事かな
あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。
hout[ary[i]] = hin
ここに>>208氏のメソッドを使えば>>220に近い結果が出せた。
add(hout,ary[i],hin)

マージに拘りすぎ、普通に枚挙すれ
0267チンパンジー愛ちゃん2009/08/19(水) 02:30:13
>>264
アンダースコアは気にしないで。単語の区切りに使っただけ。
こっちの方が迷わなくていいかな。
×h["unknown_value"] += unknown_value_key
○h["unknownkey"] += unknownvalue
これはhのハッシュに存在していないキーのことをいいたかったんだけど、
愛ちゃんの変数名の付け方がおかしかったね。ごめんね。
> これは ハッシュhにunknownのvalueをkeyとしたものに
> unknownのvalueのkeyのvalueを足しているということでいいんですか?
話がややこしくなってるね。変な変数名でごめんね。

> hout[ary[i]] とやらないと...
これは正しいよ。そうしないと得られないよ。
02682032009/08/19(水) 03:10:28
>>266
ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。

>>267
変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。
0269チンパンジー愛ちゃん2009/08/19(水) 03:51:55
> しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と
> 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね

うんにゃ、違うよ。hinじゃないよ。
h["unknownkey"] += unknownvalue
と結びつけて考えないといけないのは以下の箇所

hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず

hin.each do |key, value|
hout[ary[i]][key] += value
end
0270デフォルトの名無しさん2009/08/19(水) 04:43:35
的確なレスもできないくせにコテうぜえ
0271デフォルトの名無しさん2009/08/19(水) 05:30:04
ナツノオモイデ君はどこでも厄介だ

>>265
本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
0272デフォルトの名無しさん2009/08/19(水) 06:01:39
>>245
arr = Array.new
p arr[3] #=> nil

これを「nil ではなく 0」にしたいのだと推測
できません
「arr[3] が nil なら 0 を代入」という手順を経るのが通例です
この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます
配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは
「nil以外のオブジェクトが勝手に若い要素全てに代入される」
という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう

もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか

arr = Array.new(5)
arr.fill{ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

あるいは new のときにやっちゃってください

arr = Array.new(5){ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

[] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
0273デフォルトの名無しさん2009/08/19(水) 11:00:07
>>245
Rubyの配列にはそういう機能がないです。残念でした。
代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。
たとえば
arr = [1, 2, 3]
puts (arr[5] ||= 0) + 1
みたいな。

あとは Array#[] を上書きすればいいのかなー
class Array
 def [](x)
  val = super(x)
  val = self[x] = 0 if val.nil?
  return val
 end
end
とか。
0274デフォルトの名無しさん2009/08/19(水) 11:12:08
>>231
めんどくせぇソース全文うpってくれ
02752032009/08/19(水) 11:43:54
>>263
遅くなってすいません。こうですか?
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
hin.each do |key, value|
hout[ary[i]][key] += value
end
}
pp hout

実行すると
at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
from mat.rb:11:in `each'
from mat.rb:11
from mat.rb:5:in `times'
from mat.rb:5
となってしまいます。
0276デフォルトの名無しさん2009/08/19(水) 12:01:02
>>275
自分で考えてほしいからエラーのヒントだけ
>hout=Hash.new
>#hout[ary[i]] = hin
>hout[ary[i]][key] += value
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
02772032009/08/19(水) 12:32:53
>>276
hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
0278デフォルトの名無しさん2009/08/19(水) 12:44:23
>>277
>hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ

で、このときのxはなんだとおもう?
02792032009/08/19(水) 12:50:17
>>278
xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
0280デフォルトの名無しさん2009/08/19(水) 12:58:15
なんどめだナウシカ

ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて
「オブジェクト h の [] メソッドに引数 key を渡している」
という処理を簡単に表記できるように特別扱いされたものに過ぎない

h = {'one' => 1'}
p h['one'] #=> 1
p h.[]('one') #=> 1

つまり、h['one']['two'] という表記があったなら、それは

 h.[]('one').[]('two')

というメソッドチェーンを表しているに過ぎない
メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、
が nil だと普通に NoMethodError になる
そんだけ
02812032009/08/19(水) 12:58:33
あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね
0282デフォルトの名無しさん2009/08/19(水) 13:14:39
これを一括ダウンロードするのってどうやるの?
http://www.boostermp3.com/audio/index.php?search=perfume
0283デフォルトの名無しさん2009/08/19(水) 13:27:56
うぜえからダウンローダー使うなってページ構造に書いてあるな
まあ知識がないなら手作業でやりゃいいんじゃねえの
0284デフォルトの名無しさん2009/08/19(水) 13:34:11
JavaScriptのリンククリックするだけのように見えるから
JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする
内容が内容だけにこれ以上は自力でやれとしか
02852032009/08/19(水) 14:03:15
>>280
すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?
0286デフォルトの名無しさん2009/08/19(水) 14:09:22
>>285
そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな
0287デフォルトの名無しさん2009/08/19(水) 14:22:23
よし、ではハッシュの初期値を使うのは禁止だ
理由は、全く理解していないから

望ましい処理を自力で一度書け
どういう時にどうなっていて欲しいかを if で条件分岐しろ
0288デフォルトの名無しさん2009/08/19(水) 14:25:13
なんかみんなを混乱させているようだね。
>>275
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
これを説明すると、まずat.rbの12行目でエラーが起きている。
エラーの内容は、nilに対して '[]' というメソッドを実行しようとしているため。
つまり nil[i] のようなことをしている。
at.rbの12行目がなにかわからないけど、hout[ary[i]][key] だとしたら、
・aryがnilのせいで ary[i] がエラー
・houtがnilのせいで hout[ary[i]] がエラー
・hout[ary[i]]がnilのせいで hout[ary[i][key] がエラー
のどれかが原因。
あとは自分で調べて。
02892312009/08/19(水) 14:52:04
>>274
遅くなりましたが>>231.255.258.259.265のソースの全文です。。

ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up31158.zip
0290チンパンジー愛ちゃん2009/08/19(水) 15:17:23
初心者が混乱しているときは大抵教え方が悪いと思っていたけどやっぱりそうだった。
ごめん、答えだけ書くね。大体>>220と同じ出力になるよ。"w5" => {...}だけ違うけど。

require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
if hout[ary[i]].nil?
hout[ary[i]] = hin
else
hin.each do |key, value|
hout[ary[i]][key] += value
end
end
}
pp hout
0291デフォルトの名無しさん2009/08/19(水) 15:24:45
的確なレスもできないくせにコテうぜえ
0292デフォルトの名無しさん2009/08/19(水) 15:25:05
>>289
やっぱsixamoかよ、なんでわざわざ名前伏せるんだw
でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか

とりあえずホンモノ使っときゃいいんじゃね
http://yowaken.dip.jp/sixamo/
0293デフォルトの名無しさん2009/08/19(水) 15:32:10
>>292
本物はRubyのバージョン的に動かないって書いてあったので・・。
動かしてみた感じでは本物は受け答えできず。
改変版は数行実行したのちエラー。
ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。

本物より動きそうなんですがね。。
0294デフォルトの名無しさん2009/08/19(水) 15:42:14
厳しい言い方だが、

あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ
あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ

どっちか
02952032009/08/19(水) 15:58:50
>>286->>288,>>290

ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。
0296チンパンジー愛ちゃん2009/08/19(水) 16:15:54
mecab坊やはどうなったの?解決したの?
0297デフォルトの名無しさん2009/08/19(水) 16:28:45
的確なレスもできないくせにコテうぜえ
0298デフォルトの名無しさん2009/08/19(水) 16:48:22
ここまで全部読み飛ばした。
寝る。
0299デフォルトの名無しさん2009/08/19(水) 17:02:48
とりあえず
みんな
おつかれ
0300デフォルトの名無しさん2009/08/19(水) 18:36:53
>>293
Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め
0301デフォルトの名無しさん2009/08/19(水) 19:09:17
1.8w
0302デフォルトの名無しさん2009/08/19(水) 19:48:41
>>290
>初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから>>1に追加してほしいくらいだ。
0303デフォルトの名無しさん2009/08/19(水) 20:06:36
本人が言うから名言なんであって
もし質問者側からそんなこと言われたらたまったもんじゃないな
0304チンパンジー愛ちゃん2009/08/19(水) 21:29:48
教える側は常に心の奥底で思っていないといけないことですよ。
独りよがりの教えほど迷惑なものはありませんから。
03051912009/08/19(水) 22:21:17
すまん、俺が変な野郎(>>192)を呼び込んでしまったようだ orz...
あとは俺に任せてくれ。
0306デフォルトの名無しさん2009/08/19(水) 22:30:23
どっちもサルに見えるのだが
0307デフォルトの名無しさん2009/08/20(木) 03:35:31
逆引きRuby誰か書き足してくれ
0308デフォルトの名無しさん2009/08/20(木) 07:19:18
>>307
どっちの逆引き?
0309デフォルトの名無しさん2009/08/20(木) 08:08:59
とりあえず、逆引きRubyという話題を振る時は、
どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?
0310デフォルトの名無しさん2009/08/20(木) 08:12:14
日本語でおk
0311デフォルトの名無しさん2009/08/20(木) 08:58:41
レシピブック初版にはお世話になったけど
最近いろいろあるから次買うとき迷うな

>>309
書き足すっていうぐらいだからWikiのほうだろう
0312デフォルトの名無しさん2009/08/20(木) 13:38:05
Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど
これって困ってる人いないのかな
0313デフォルトの名無しさん2009/08/20(木) 14:06:37
>>304
そこまで自覚があるなら、さっさと消えろよ
■ このスレッドは過去ログ倉庫に格納されています