トップページ⇒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/
0792デフォルトの名無しさん2012/12/14(金) 20:14:27.84
>>784
> ↓こんな感じで書きたい
> begin
>  raise :hoge if hoge
>  raise :fuga if fuga
> rescue :hoge
>  puts "うわー"
> rescue :fuga
>  puts "ぬわー"
> end

元がコレだからな
なんで例外使いたいんだか
0793デフォルトの名無しさん2012/12/14(金) 20:26:11.93
気を遣って単純な例示にしようとしたら「これならそもそもいらないんじゃね??」みたいな反応を返される悲しい例
0794デフォルトの名無しさん2012/12/14(金) 22:53:54.04
gotoが有れば解決
0795デフォルトの名無しさん2012/12/14(金) 23:03:50.62
class SymbolException < Exception
 attr_reader :sym
 def initialize(sym)
  @sym = sym
 end
end

class Symbol
 alias old_match ===
 def ===(obj)
  return old_match(obj) unless SymbolException === obj
  obj.sym == self
 end
end

def raise(*args)
 Kernel.raise *args unless args.length == 1 && Symbol === args[0]
 raise SymbolException.new(args[0])
end



begin
 raise :hoge
rescue :fuga
 p "fuga"
rescue :hoge
 p "hoge"
end

こんなの実装できるとかRuby変態だろ…
0796デフォルトの名無しさん2012/12/15(土) 00:57:15.80
>>795
>こんなの実装できるとかRuby変態だろ…

偽装Lispだからな。
0797デフォルトの名無しさん2012/12/15(土) 01:02:50.15
おまいらの会話、高度過ぎて付いていけない。
おまいらなら、余裕でRuby GOLDが取れそうだな。
0798デフォルトの名無しさん2012/12/15(土) 02:12:28.77
sendメソッド使いまくるソースが嫌い
なんでもかんでも重複を省こうとする
アホちゃうかと
読みやすさ、メンテのしやすさ、手間、バランスを考えろ
0799デフォルトの名無しさん2012/12/15(土) 02:32:23.51
再利用するってことは、依存が増えるってことだからな。
そこが分かってない。
0800デフォルトの名無しさん2012/12/15(土) 05:33:45.21
Rubyって
def doya
 if a == 1# えー
 || b =~ /hoge/ # びー
 || c !~ /moge/ # しー
 || d.empty? # でー
 || !e.nil? # いー
 then
  puts "わーい"
 else
  puts "ぐはあ"
 end
end
とか書けないんだ。
0801デフォルトの名無しさん2012/12/15(土) 05:35:48.83
↓だと各条件にコメントが書けない
一行で書けるブロックコメントも無いしなぁ
def doya_sub
 if a == 1 || b =~ /hoge/ || c !~ /moge/ || if d.empty? || !e.nil?
  puts "わーい"
 else
  puts "ぐはあ"
 end
end

じゃあ↓こうする?
こりゃりたーんりたーん五月蝿いなぁw
def doya
 puts doya_sab ? "わーい" : "ぐはあ"
end

def doya_sub
 return true if a == 1# えー
 return true if b =~ /hoge/ # びー
 return true if c !~ /moge/ # しー
 return true if d.empty? # でー
 return true if !e.nil? # いー
 return false
end
0802デフォルトの名無しさん2012/12/15(土) 07:13:54.44
>>800
はい、Ruby的には判断できませぬ
インデントとか揃わなくてかっこ悪いとたいへん不評なのですが

if
cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
のようにorを後ろに書いてくだされ
0803デフォルトの名無しさん2012/12/15(土) 07:25:33.12
あ、ifで改行しちゃった

if cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
0804デフォルトの名無しさん2012/12/15(土) 19:21:50.57
rubyのbegin-endが嫌いで{}に変われば良いのにって思ってたけれど、
groovyと比較するとbegin-endの方が目に優しいね
0805デフォルトの名無しさん2012/12/16(日) 01:30:47.96
わざとレトロなトークンを使うことで
記号含有率を下げると同時に、`波括弧を目立ちやすくする
という設計意図があるらしい
0806デフォルトの名無しさん2012/12/16(日) 04:28:35.10
文句のほとんどがifの部分で、文句の本質は「俺の知ってるCと違う」なので、礼儀正しく無視されてきたという経緯はないでもない
トークンとして長くて大きくて実質"予約語"として命名余地を圧迫してることは否定しないが、使用中の見易さそのものは大差ねえよ
0807デフォルトの名無しさん2012/12/16(日) 04:32:17.38
インデントがひどいと{}のほうがbegin-endよりまともに読めそうだけどまともにインデントすればいい話か
0808デフォルトの名無しさん2012/12/16(日) 08:49:25.76
rubyのbegin-endは、Javaのtry〜、であって、{} じゃないぞ。
0809デフォルトの名無しさん2012/12/16(日) 12:49:58.30
rvmで1.8系と1.9系といくつかのバージョンをインストールしてみたんですが
スクリプトから特定のバージョンを指定で実行するようにしたい時は
#!/Users/username/.rvm/rubies/ruby-1.9.2-p290/bin/ruby
とかしないといけないんでしょうか。

これだとバージョンを上げるとスクリプトを修正しないといけないので、
#!/Users/username/.rvm/rubies/ruby-1.9
とかで指定できて、rvmで自動的に最新の1.9系へのシンボリックリンクがはられる、
みたいのができると便利だと思うんですけどできないですか?
0810デフォルトの名無しさん2012/12/16(日) 13:24:54.53
>>809
rvm に 1.9系の最新 みたいな概念はないんじゃない?
0811デフォルトの名無しさん2012/12/17(月) 04:53:24.51
Ruby1.9.3です
定数のように値を後で変更できない配列やhashを作成することはできませんか?
0812デフォルトの名無しさん2012/12/17(月) 05:28:33.09
irb> a = [1,2]
irb> a.freeze
irb> a << 3
RuntimeError: can't modify frozen array
irb> p a
[1, 2]

ただ、実際のところはそれほど強制的な効果はなく、わりと嫌われてもいる
ユーザーに値を変更して欲しくないのなら、マニュアルにそう書くか、そもそも自己責任で放置するほうがよい
0813デフォルトの名無しさん2012/12/17(月) 06:04:06.74
Rubyではクラスやメソッドやデータ構造を他人が変更しうるのは「当たり前」で、
変更したらうまく動作しない可能性があるのも「当たり前」
「これを外部から変更されたらプログラムが誤動作するので変更を禁止したい」
とか過保護または過敏に考える必要はない
0814デフォルトの名無しさん2012/12/17(月) 06:57:23.26
禁止したいときはドキュメントに書く
0815デフォルトの名無しさん2012/12/17(月) 06:59:51.34
Refinementsが入れば改善されるんじゃないの?
0816デフォルトの名無しさん2012/12/18(火) 00:14:43.70
酷い知ったかを見た
Railsのソース見てもfreezeぐらいたくさん出てくるのに。
0817デフォルトの名無しさん2012/12/18(火) 04:35:32.86
私は宝石を作っている。私はSTDLIBにだ "multi_json"依存関係の代わりに "json"を使うべきでしょうか?
0818デフォルトの名無しさん2012/12/18(火) 11:15:16.40
>>811
こういうのじゃダメなの?
class << FOO=Object.new
def bar
1
end
def baz
2
end
end
0819デフォルトの名無しさん2012/12/18(火) 19:37:56.04
自分の用途ではfreezeでよさそうです、ありがとうございました
0820デフォルトの名無しさん2012/12/19(水) 11:32:58.13
ここを参考にしてttp://qiita.com/items/348195ef6f797af08010

class Counter < BasicObject
 def initialize
  @count = 0
 end
 def plus(n)
  @count += n
 end
 def method_missing(*a)
  @count.send(*a)
 end
end

みたいな感じのクラスを作って思い通りの動作は得られたのですが、
インスタンスの.classがFixnumになってしまうのがどうにも・・・
他にうまい実装方法ありませんかね?
0821デフォルトの名無しさん2012/12/19(水) 12:17:38.57
ところで、対応するのは class メソッドだけでいいの?
ancestorsは? kind_of? は? instance_methods で plus が出ないけどいい?

ということで選んで移譲するのがいいように思う
てゆーか Object や Module のメソッドを使いたいなら BasicObject の直接継承なんてやってはいかんぜよ
0822デフォルトの名無しさん2012/12/19(水) 12:59:51.22
実際問題としてやりたいのは

class Counter
 attr_reader :count
 def initialize
  @count = 0
 end
 def plus(n)
  @count += n
 end
end

こういうクラスがあったとして
counter = Counter.new
counter.count #こうじゃなくてcounter単体で@countの値を得たい

つまり.countを省略したいと言うだけのことなのです
委譲を使って下記のようにも書けたのですが・・・そういうことではないんですかね?

class Counter < DelegateClass(Integer)
 def initialize
  super 0
 end
 def plus(n)
  __setobj__ self + n
 end
end
0823デフォルトの名無しさん2012/12/19(水) 21:58:40.90
便乗して質問になるんですが
pでの表示はinspectとか、文字列に埋め込んだりするとto_sとかが呼び出されて変換されますが
足し算などでは勝手に何かメソッドを呼んでくれたりはしないんでしょうか?
0824デフォルトの名無しさん2012/12/19(水) 23:57:44.76
足し算に使うと整数100のように振る舞うクラス。

class C
# C.new + 10 #=> 110
def +(other) 100 + other end
# 10 + C.enw #=> 110
def coerce(n) [n,100] end
end
08258232012/12/20(木) 01:35:31.25
>>824
なるほどcoerceというのが呼ばれるんですね
ありがとうございました
0826デフォルトの名無しさん2012/12/20(木) 22:53:23.66
分散並列処理フレームワークありませんか?
0827デフォルトの名無しさん2012/12/21(金) 01:29:03.32
しょうもない質問で申し訳ないのですが、スクレイピング出来るコードをサーバー上に起きました。

ruby ファイル名.rb で必要な情報一覧はLinuxコンソール上から叩くと取得出来ています。

これをブラウザ上にテキスト形式でどの様に表示させればいいのか解らず、sinatraと言うフレームワークもためしましたが上手く行かず、、、

多分凄い簡単な気もするのですが全くわかりません。

テキストにしたいと言う理由は実行結果をjson形式の書式に無理やり変えている為です。require jsonは利用してません。DBは利用してません。

プログラミング自体初心者です。。
0828デフォルトの名無しさん2012/12/21(金) 02:14:25.80
君は日本語も初心者のようだね
0829デフォルトの名無しさん2012/12/21(金) 02:17:30.67
>>827
とりあえず、ここを嫁。
http://www.sinatrarb.com/intro-jp.html
んでhttp://localhost:4567をWebブラウザでアクセスしてうまくいってそうなら、
次は、↓みたいにparamsってHashの変数を使うように書き換えて再起動して、

# myapp.rb
require 'sinatra'
get '/' do
 return '嫁は' + params[:yome] + '妹' + params[:imouto]
end

↓でアクセスして引数が参照できたら、
http://localhost:4567/?yome=morisama&;imouto=rikka

あとは好きにいじって行け。
あとHTTPの勉強が少し要ると思う。
0830デフォルトの名無しさん2012/12/21(金) 02:24:11.23
>>829
有り難うございます。

:4567で起動はしてるのですが、Linuxのコンソール上には結果は出ていてエラーもありません。

ですがブラウザは真っ白な状態になっていてソースを表示しても何も入ってないと言う感じです。

スクリプトの結果をコンソールと同じ様にしたいだけなのにそれがどうしても出来ません。
0831デフォルトの名無しさん2012/12/21(金) 02:30:02.59
>>829

ちなみにコードは

get '/' do

ここにまるごと張り付けてます。

end

ハッシュを利用しないといけないのであればなぜそうなのかが公式見ても理解出来ません。。。
0832デフォルトの名無しさん2012/12/21(金) 02:47:36.88
クラスタマシン使った方が安上がりになりそうなことまで、hadoopつかってる企業とかありそう
0833デフォルトの名無しさん2012/12/21(金) 02:56:23.28
>>831
コンソールへの出力にputsとか使ってるんだろう?
putsは引数の文字列をlinuxコンソールに出力するメソッド(本当は違うけど)
今現在コンソールに出力されてる文字列をブラウザに送るにはどうすればいいかは
829に書いてくれてあるのをみればわかるだろわかるよなわかってくれよそんくらい
0834デフォルトの名無しさん2012/12/21(金) 03:26:47.76
>>831
get '/' do

 return "森夏ちゃんエロい"
end

とかいて、表示したいもんを文字列にしてreturnで返せ。
そうしたらブラウザで
http://localhost:4567/
にアクセスすると"森夏ちゃんエロい"が表示されるんだよ。
0835デフォルトの名無しさん2012/12/21(金) 03:51:48.91
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘
0836デフォルトの名無しさん2012/12/22(土) 14:51:40.51
gs = TCPServer.new(12345)
s = gs.accept()
s.puts("あ")
でクライアントに"あ"が送信されますが送信文に改行\nを加えるとそこで送信文が終わってしまします
つまりs.puts("あ\nい")とするとクライアントは"あ"しか受信してくれません
なんとかなりませんか
0837デフォルトの名無しさん2012/12/22(土) 14:58:50.35
getsは1行読み込むんだから、putsで改行1つ入れたらそりゃ2回gets呼ばんといかんだろう。
http://doc.ruby-lang.org/ja/1.9.3/method/IO/i/gets.html
0838デフォルトの名無しさん2012/12/23(日) 00:52:07.77
windowsコマンドプロンプトirbで無限ループに入るとCtrl+C押しても止まりませんよね
皆さんどうしていますか
0839デフォルトの名無しさん2012/12/23(日) 01:41:22.82
いままで見たことない
exit も打てなくて C-c も使えないということ?

じゃ、GUIのタスクマネージャから終了させる
コマンドラインだったら、別の DOS プロンプトから tasklist で
実行時期が早めの DOSプロンプト(cmd.exe)の pid を調べて kill する
0840デフォルトの名無しさん2012/12/23(日) 08:32:59.15
>実行時期が早めの DOSプロンプト(cmd.exe)の pid を調べて kill する

嘘を教えるな
irb.exe もしくは ruby.exe の pid を調べて kill する
08418392012/12/24(月) 00:28:12.80
素で間違えてしまった
フォローありがとう
0842デフォルトの名無しさん2012/12/28(金) 11:02:17.08
require 'net/smtp'
してrubyでメールを送ることに成功したのですが、宛先がgmailのときだけ
/usr/lib/ruby/1.8/net/smtp.rb:942:in `check_response': 553 5.7.1 <[email protected]>... Relay operation rejected (Net::SMTPFatalError)
from /usr/lib/ruby/1.8/net/smtp.rb:911:in `getok'
from /usr/lib/ruby/1.8/net/smtp.rb:854:in `rcptto'
from /usr/lib/ruby/1.8/net/smtp.rb:835:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `each'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:654:in `sendmail'
from ./mailtest.rb:26:in `sendmail'
from /usr/lib/ruby/1.8/net/smtp.rb:526:in `start'
from /usr/lib/ruby/1.8/net/smtp.rb:463:in `start'
from ./mailtest.rb:25:in `sendmail'
from ./mailtest.rb:68
となって失敗してしまいます。対処法をご存知のかたは教えて下さい。
08438422012/12/28(金) 11:51:38.09
すみません
smtpの認証パラメータを設定していなかったのが原因でした
0844デフォルトの名無しさん2012/12/31(月) 07:06:44.40
ファイルを読み込んで特定の文字列を別の文字列に置き換えるようにしたいです。

test01
うんこ
うんち
う○こ

のように書かれているとします。
このうち「う○こ」を「うんこ」に置き換えたいのですがどうすればいいですか?
ファイルに直接変更を加えるということです。
0845デフォルトの名無しさん2012/12/31(月) 10:37:49.71
ruby -i -p -e '$_ に対する置換処理' 対象ファイル
0846デフォルトの名無しさん2012/12/31(月) 11:02:01.60
>>844
例
1.ファイルを一時ファイルにコピーする。
2.もとのファイルの名前で新しいファイルをつくる(書込み用)
3.一時ファイルを1行ずつよんで、該当する部分を変更して書込み用ファイルに出力する。
0847デフォルトの名無しさん2012/12/31(月) 11:13:30.77
sub(pattern, replace)
文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成し返します

gsub(pattern, replace)
文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成し返します

リファレンスマニュアル
0848デフォルトの名無しさん2012/12/31(月) 11:15:02.14
`sed -i -e "s/う○こ/うんこ/g" #{ファイル名}`
0849デフォルトの名無しさん2012/12/31(月) 11:17:08.53
行中の文字列置換だったらsedがばっちりその用途じゃん
rubyで考えるよりも早いんじゃない
0850デフォルトの名無しさん2012/12/31(月) 11:18:17.52
とおもったらすでに書かれていた
0851デフォルトの名無しさん2012/12/31(月) 18:59:24.83
Windowsにはsedはないから
>>847の方法を使う必要がある
フィルタ的に使うのに意外と
手間がかかるよねrubyは
0852デフォルトの名無しさん2012/12/31(月) 19:26:52.36
windosでのsed実装を探したほうが早くねってなる流れ
0853デフォルトの名無しさん2012/12/31(月) 20:07:43.05
時代はWindowsw
0854デフォルトの名無しさん2012/12/31(月) 20:09:58.73
>>852
Windows版なんて聞いたことないし、あったとしても
どこの馬の骨が作ったかわからないフリーソフトレベルだろうから
大事なテキスト処理は任せられないなあ
多くのユーザーに揉まれたUnixツール群は偉大だ
0855デフォルトの名無しさん2012/12/31(月) 20:36:15.57
cygwinくらい知ってろよ。
0856デフォルトの名無しさん2012/12/31(月) 21:38:07.26
rubyでコピーしないでrenameできる
0857デフォルトの名無しさん2012/12/31(月) 21:44:25.90
>>854
windowsでコンパイルすればいいだろ。バイナリしか提供されないノンフリーソフトじゃないんだから。
0858デフォルトの名無しさん2012/12/31(月) 22:07:57.60
GNU sedみたいなオプソのsedがあるからな
0859デフォルトの名無しさん2013/01/01(火) 00:42:03.47
シフトJISとおもってたら、機種依存文字、外字が混在してたりする
0860デフォルトの名無しさん2013/01/01(火) 03:45:47.57
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
死ねゴミ共が
0861 【大吉】 【699円】 2013/01/01(火) 04:21:05.39
あけおめ
0862 【大吉】 2013/01/01(火) 08:47:45.99
Python 最強
0863デフォルトの名無しさん2013/01/02(水) 18:17:46.23
>>859
俺も今そこで手が止まってる

nokogiriで特定の動的ページから複数のサイトをランダムにスクレイピングしたくて
パースする時にファイルの宣言文を見てエンコードする文字コードを自動で決めてくれるnokogiriの仕様に依存してるわけだけど
shiftjisエンコードされてて機種依存文字が入っていた場合だと何故かエンコードエラーが出るんだよなー
解決策として

・nokogiriが使ってるiconvを機種依存文字対応のものにする
・Mechanize経由でパースすれば多分大丈夫

みたいのが調べて出てきたけどiconvってそもそも何ぞや?
標準添付か組み込みのライブラリで解決できる方法は無いんか?とか
理解しないといけないことが多すぎて何か腑に落ちなくてもやもやイライラしてる

三が日までに何とかしないと社内で無能扱い確定だ
年明けに何でこんなことやってるんだろ…
0864!omikuji2013/01/02(水) 18:19:55.28
あけましておめでとう
0865デフォルトの名無しさん2013/01/05(土) 10:17:04.79
日本 Perl
海外 Python


何でこんな中途半端なRubyなんて使ってるクズがいるんだろうな
0866デフォルトの名無しさん2013/01/05(土) 10:21:05.96
LL戦争前のMatzの布教と宗教性だな
Ruby厨がMacBook持って萌えアニメやOSS信仰してるあたりで反吐が出る
iphoneいじってRuby会議ですか?
くだらねー小さい技術ネタで盛り上がって何も生産性のない話題っすよね
railsもオワコンだし
Rubyはオワコンなんだよ
その現実を受け止めよう
現実が変わることはない
0867デフォルトの名無しさん2013/01/05(土) 11:34:12.67
反吐吐いて脱水症状でそこらへんで一人で野垂れ死んでれば?

ここでそうやっていくらdisっても、現実は変わらないよw
現実を受け止めようw
現実が変わることはないw
0868デフォルトの名無しさん2013/01/05(土) 13:13:22.73
↑w
0869デフォルトの名無しさん2013/01/05(土) 18:34:26.78
アプリ起業 iPhone C#まとめ Ver 1.5
http://tinyurl. com/9w97424
0870デフォルトの名無しさん2013/01/06(日) 17:04:45.07
自
0871デフォルトの名無しさん2013/01/06(日) 17:05:16.48
分
0872デフォルトの名無しさん2013/01/06(日) 17:24:46.14
で
0873デフォルトの名無しさん2013/01/06(日) 17:25:26.68
調
0874デフォルトの名無しさん2013/01/06(日) 17:25:57.72
べ
0875デフォルトの名無しさん2013/01/06(日) 17:27:08.68
ろ
0876デフォルトの名無しさん2013/01/06(日) 17:42:53.52
ゴ
0877デフォルトの名無しさん2013/01/06(日) 17:43:40.64
ミ
08788272013/01/11(金) 21:44:54.56
お久しぶりです。
あれからちょっと手を動かせなくて久しぶりにレス頂いていた書き込みを読み結果が表示出来る様になりました。
式展開、インスタンス変数と言う言葉を学習しました。。。(恥
ですが表示結果の全てを出力したいのに一行しか出て来ない状況でどの様に記述するのが正しいのか、
もしくはもっと別の記述方法があるのかご指導頂きたく…

get '/' do

content_type :json

hoge = Rack::Utils.parse_query(@env['rack.request.form_vars'])
param = params['keyword']
keyword = param
escaped_keyword = CGI.escape(keyword)
doc = Nokogiri.HTML(open("http://www.google.co.jp/search?&;num=10&hl=en&safe=off&client=safari&tbo=d&rls=en&source=lnms&tbm=nws&sa=X&tbs=qdr:h24&ie=UTF-8&oe=UTF-8&q=#{keyword}"))
start = "["
doc.search("div#search ol li").each_with_index do |li, idx|
href = ""
html = ""
link = ""
li.search("h3 a").each do |alink|
08798272013/01/11(金) 21:46:29.62
長過ぎて書き込めず上記の続きです。

href = alink.attribute("href")
URI.parse(href).query.split(/&/).each do |str|
strs = str.split(/=/)
link = strs[1] if strs[0] == "q"
"asdfasfdasfdafd"
end
html = alink.inner_html
end
next if "#{href}" !~ /^¥/url/
@@_beg ="{"
@@_dom = "¥"domain¥":¥"#{link.split("/")[2]}¥","
@@_url = "¥"url¥":¥"#{link}¥","
@@_t = "¥"title¥":¥"#{html}¥""
@@_clo = "},"
end
@@_null = "{¥"null¥":¥"null¥"}"
@@_close = "]"
res =[start,@@_url,@@_t,@@_clo,@@_null,@@_close]
end

笑っちゃう様なコードかもしれませんが、ここまで来るのに一苦労でした。難しいですね。
またこの状態だと1ペアの結果しか返せずコンソールに表示される10ペア全ての結果を返したい感じです…
0880デフォルトの名無しさん2013/01/11(金) 22:27:09.41
sinatraだっけ?

rackup すると
vendor/bundle/ruby/2.0.0/gems/rack-1.4.3/lib/rack/builder.rb:129:
in `to_app': missing run or map statement (RuntimeError)
って言われるんだけど?

あと、なんでクラス変数(@@....)を使う?
0881デフォルトの名無しさん2013/01/11(金) 22:41:49.86
>>880
はい、sinatraで試しています。
私の環境ではエラーが出てないのですが、、

クラス変数ですか、
インスタンス変数?を使ったつもりでした 汗
0882デフォルトの名無しさん2013/01/12(土) 01:01:01.55
>>881
URI.parse....each のブロックで @@_xxx に結果を放り込んでるけど、これが毎回上書きされてるから最後に解析された結果しか出力されな
い。
a = 0; 10.times { |i| a = i }; [a]
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
にならないのと一緒で。
思い通りの動作にするなら
a = []; 10.times { |i| a.push i }; a
みたいに配列に放り込むようにすればいい

あと、今回の場合、クラス変数(@@foo)は勿論、インスタンス変数(@foo)も使う必要ないで
0883デフォルトの名無しさん2013/01/12(土) 01:19:57.51
>>882
有り難うございます!
ここのブロック周りはコピペを弄ってる状態に近くてアドバイス内容の意味までは的確に理解出来ませんが今から解読しながら頑張ってみます。

全く先に進めなかったのでこれでまた前進できるかもしれません。
08848272013/01/12(土) 01:35:21.11
>>882

今ソースを見ながら考えてます。
ですが具体的にどこに何を書くのかさっぱり分らず
この感じだと今迄と同様一日以上悩んでもよく分らないパターンになりそうです。

もし宜しければ、参考になりそうなホームページ等あったら教えて頂きたいです。
今まで調べたキーワードは以下で、それに関連するページは一通り見てきました。

変数 式展開, インスタンス変数 展開, 配列展開, 連想配列, 配列 変数 展開

既に関連ワードがあったら見たけど理解出来てないと言う感じです。
何が分らないのかが分らない感じも多少あります。Orz.
08858272013/01/12(土) 04:50:36.39
こんなのサラサラ書ける人達は凄いな。。
今日は寝よう。。
0886デフォルトの名無しさん2013/01/12(土) 10:03:54.82
コピペして動いたら満足して次にいくんじゃなくて
何故それで動いてるのか1行1行理解して進まなきゃダメやで
0887デフォルトの名無しさん2013/01/12(土) 11:07:23.43
いちばん大事な
・ メソッドの作り方使い方
が入ってない気がする
行数が10行超すか、製作日数が1日を超したなら、一見冗長になったように感じたとしても最低限メソッドにするべき

def ユーザー入力からキーワードを抽出して返す
end
def ぐぐってHTMLを返す(keyword)
end
def HTMLをNokogiriでパースして生データにして返す(html)
end
def HTML由来の生データをHTML出力用に整形する(data)
end
def 受け取った文字列をRackで表示するだけ(output)
end

keyword = ユーザー入力からキーワードを抽出して返す
html = ぐぐってHTMLを返す(keyword)
data = HTMLをNokogiriでパースして生データにして返す(html)
output = HTML由来の生データをHTML出力用に整形する(data)
受け取った文字列をRackで表示するだけ(output)

なんも考えてないメソッド構成だが、これのいいとこはスクリプト作成中にいちいちブラウザから入力したりGoogleにアクセスしたりしなくてもいいように作るのが簡単なとこだ

# keyword = ユーザー入力からキーワードを抽出して返す
# html = ぐぐってHTMLを返す(keyword)
html = File.open(事前にHDDに保存していたHTMLファイル,'rb'){|f| f.read}

Nokogiriのパースの部分がうまくいってない気がするなら、スクリプト途中でdataをpなりputsなりして表示させて確かめ、exitで終了させればいい
data = HTMLをNokogiriでパースして生データにして返す(html)
p data
exit
0888デフォルトの名無しさん2013/01/12(土) 12:23:29.46
モヤモヤした脳内からこねくり回すんではなく、処理を小さな単位の"言葉"でまとめる癖がつくので
メソッドの作成はRubyの基礎覚えたら極力早いうちからやるのがおすすめ
0889デフォルトの名無しさん2013/01/12(土) 12:27:16.51
10行で1メソッドってやり過ぎじゃない?
メソッドだらけになっちまう。せめて100行で
0890デフォルトの名無しさん2013/01/12(土) 12:34:19.57
クラスやモジュールの作成云々はずっとあとでいいな
「自作メソッド多過ぎ! わけわからん! 耐えられん!」とか思ってから勉強すると
実際の困難を解決する手段としてすんなり覚えられる

オブジェクト指向とかインスタンスとかそのへんの概念はとりあえず飛ばす
ひとまず、メソッドをまとめて一気に(または場合分けで)順次起動するシステムとしてクラスを使う

>>889
>>887も言ってるが、処理がごっついかどうかにもよるかと
自前で正規表現して自前で埋め込み文字列するだけならメソッドにする必要はないかも
今回のようにopen-uriでWebアクセスしたりNokogiriで面妖な抽出をしたりHTMLの変なデータ作ったりRackでDSL()する場合は
元スクリプトが10行程度でもいくつかメソッドにしたほうが気楽かもしんない

本当の"書き捨て"のスクリプトなんてのはそうそうあるもんじゃない、特に初学者
0891デフォルトの名無しさん2013/01/12(土) 13:36:45.31
結果でなくてまず設計でメソッドわけろよ。
0892デフォルトの名無しさん2013/01/12(土) 13:37:30.35
>>889
俺なんて1行のメソッド山ほど作るが…
■ このスレッドは過去ログ倉庫に格納されています