Ruby 初心者スレッド Part 36

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2010/05/13(木) 20:09:51
おーっと翼くん1週間以上前のボテ球を拾いにいくこれはどうしたことだー!?
953948:2010/05/13(木) 22:32:13
向上心を持ってインスタンスメソッドの書き方から勉強し直したところ、
class Proc
def curry(n = self.arity, xs = [])
(n<1) ? self[*xs] : (proc {|x| curry(n-1, xs.push(x)) })
end
end
こうなりました。勉強になりました。
954947:2010/05/13(木) 22:32:55
名前間違えました948でなく947でした
955947:2010/05/14(金) 00:19:56
たびたびすみません。xs.push(x) は xs+[x] でないとだめでした。
カリー化されたProcを2度目に呼ぶと前回のxsが継続の中に残っていて
まずかったです。
956デフォルトの名無しさん:2010/05/14(金) 03:01:01
require 'webrick'

class Servlet < WEBrick::HTTPServlet::AbstractServlet
def do_GET(req, res)
str = open("./foo.html", 'r'){|f|f.read}
res.body = str
res['content-type'] = 'text/html'
end
end

server = WEBrick::HTTPServer.new({
:Port => 4000
})
server.config[:BindAddress] = '127.0.0.1'
#server.config[:ServerType] = WEBrick::SimpleServer # SimpleServerなら問題ない
server.config[:ServerType] = WEBrick::Daemon
server.config[:ServerName] = 'server'
server.mount('/', Servlet)
trap('INT') { server.shutdown }
server.start
をLinux上で実行してブラウザからアクセスすると
>Internal Server Error
>No such file or directory - ./foo.html
とopenに失敗してしまいます。openのパスを絶対パスにすれば動くようですがコーディング上不便です
相対パスのまま動かす方法があったら教えてください。よろしくお願いします
957デフォルトの名無しさん:2010/05/14(金) 04:12:09
>>956
pwd = Dir.pwd
server.config[:StartCallback] = proc { Dir.chdir(pwd) }

# 956のソース正しくコピペしてないだろ
# サーバをnewした後でconfig設定しても無意味
958デフォルトの名無しさん:2010/05/14(金) 06:00:07
># サーバをnewした後でconfig設定しても無意味
いろいろ読み直してみたら間違ってた
訂正すると>>956はこの行が無意味になってる
> server.config[:BindAddress] = '127.0.0.1'
他にもnew前に指定しないと無効な設定があるけど、それはソース読んでくれ
959デフォルトの名無しさん:2010/05/14(金) 15:21:13
>>945
ありがとうございます。
960956:2010/05/14(金) 17:21:50
>>957-958
動きました。そういう事もあったのか
ありがとうございました
961デフォルトの名無しさん:2010/05/15(土) 23:49:36
質問です。

pメソッドで日本語表示したとき、最後の1文字だけ文字化けします。
putsは大丈夫です。
これを直すにはどうすれば良いでしょうか?

環境
 windows
 ver 1.8.7
 dos窓のコードページ 932 SJIS


ソース
$KCODE = "s"
puts $KCODE
str = "おはようからおやすみまで暮らしを見つめるテクニック"
puts str
p str


実行結果(dos窓)
SJIS
おはようからおやすみまで暮らしを見つめるテクニック
"おはようからおやすみまで暮らしを見つめるテクニッ\203N"

962デフォルトの名無しさん:2010/05/16(日) 00:07:55
r+で作成済みでないときにエラーが出るのは仕様ですか?
963デフォルトの名無しさん:2010/05/16(日) 00:09:29
>>961
patchlevelを上げる

>>962
仕様
作成させたければw+
964デフォルトの名無しさん:2010/05/16(日) 00:10:34
>>962
中身を消したくなければ IO::RDWR|IO::CREAT
965デフォルトの名無しさん:2010/05/16(日) 00:21:40
>>961
1.8.7-p249のバグ
966961:2010/05/16(日) 00:54:36
>963
>965
回答ありがとうございます。
悩んで損しました。
967デフォルトの名無しさん:2010/05/16(日) 12:21:54
module FooModule
 def self.uho
  uho
 end
end
class FooClass
 def self.uho
  :uho
 end
end
というモジュール、クラスがあったとき
class Bar1
 include FooModule
 uho
end
は動作しませんが、
class Bar2 < Foo
 uho
end
は動作します。

ということはスタティックなクラスメソッドは継承されても、モジュールメソッドは
継承されないということだと思います。何故このような仕様になっているのか教えてください。
968デフォルトの名無しさん:2010/05/16(日) 12:23:14
書き間違えました。すみません。
x class Bar2 < Foo
o class Bar2 < FooClass
969デフォルトの名無しさん:2010/05/16(日) 12:24:29
3行目のuhoは:uhoです。すみません。
970デフォルトの名無しさん:2010/05/16(日) 13:13:22
irb> module M; def foo; 'M#foo'; end; end
irb> class C; class << self; include M; end; end
irb> puts C.foo
M#foo
irb> puts C.new.foo
NoMethodError: undefined method `foo' for #<C:0xb74a8e24>
irb> class C; include M; end
irb> puts C.new.foo
M#foo

include M は self に M のインスタンスメソッドをクラスメソッドとして追加する
このときクラスメソッドと呼ぶとわけがわからなくなるので特異メソッドとか呼んだりする
M のクラスメソッドは M = Class.new('M') のようなイメージで生成されたオブジェクト M にくっついてるメソッドなので
include や extend で外に持ち出すことはできない
include や extend して使いたいメソッドは M でインスタンスメソッドとして定義する
971デフォルトの名無しさん:2010/05/16(日) 13:54:19
open("test.csv") do |file|
file.each do |line|
line.chomp!

puts <<EOS

掲示板を作ろうとしていて、新しい書き込みが上にくるようにしたいです.
上記はプログラムの一分ですが、これのどこにreverseを入れたら良いか分かりません.
出来れば教えてください.
972デフォルトの名無しさん:2010/05/16(日) 14:06:09
ストリームをワンパスでソートするのは無理だな。
結論:無理
973デフォルトの名無しさん:2010/05/16(日) 14:06:42
>>971
一行ずつ処理を追うんだ
綺麗に書こうだなんてとりあえず二の次にしとけ

あと File#each は配列を返さないから Array クラスのメソッドの出番はないぞ
Array のメソッドを使いたいなら、どっかで配列を作れ
974デフォルトの名無しさん:2010/05/16(日) 14:11:57
>>970
ありがとうございます。
しかし、実際にそういうことをしたいのではなく、なぜモジュールとクラスで
継承の挙動が違うのかが知りたいのです。

「クラス < クラス」の場合はクラスメソッド(クラスの特異メソッド)も継承されるのに、
「クラス < モジュール」の場合はモジュールの特異メソッドは継承されません。

今のところ僕は「モジュール関数をincludeしたときにややこしくなるから」
だと思っているのですが、、、
975デフォルトの名無しさん:2010/05/16(日) 14:17:19
>>971
Ruby1.9ならeachはEnumerator返すから

file.each.to_a.reverse do |line| # File -> Enumerator -> Array -> Arrayな感じ

みたいな感じでいけるんじゃないか?確認はしてないけど。
ただ、これ一回配列に戻すってあんまりかっこよくないね。
976デフォルトの名無しさん:2010/05/16(日) 14:19:59
ごめんreverseの次eachね。やっぱりかっこよくない。
977デフォルトの名無しさん:2010/05/16(日) 14:57:49
>>973-976
いけました.
ありがとうございます.
978デフォルトの名無しさん:2010/05/16(日) 23:01:12
>>975
IO.readlinesならopenからfile.each.to_aまでやってくれるし
1.8でも使える
979デフォルトの名無しさん:2010/05/17(月) 00:26:19
引数で渡した値をそのままnewするような方法ないでしょうか?
クラスAが定義されてたとして、

hoge = "A"

obj = #[hoge].new

みたいな感じでAをnewしたいのですが。。。
980デフォルトの名無しさん:2010/05/17(月) 00:40:50
>>979
hoge = A
obj = hoge.new
981デフォルトの名無しさん:2010/05/17(月) 00:59:40
hoge = 'A' なら

Object.const_get(hoge).new
とか
eval "#{hoge}.new"
とか
982デフォルトの名無しさん:2010/05/17(月) 01:17:45
ありがとうございます!
hoge = "A"の場合、
hoge.newだと「"A"にはnewメソッド無いです」エラーになってしまいましたが、
Object.const_get(hoge).new
で動きました!ものすごく感謝です。
983デフォルトの名無しさん:2010/05/17(月) 01:18:02
deadline.each do | a,b |
c = Date.parse(b) - Date.today
d = "#{a} #{b} あと#{c}日 <br>"
puts d
end

上記のプログラムでcを一番上に持っていきたいのですが、どうしたら良いでしょうか教えていただけないでしょうか?
984デフォルトの名無しさん:2010/05/17(月) 01:26:47
deadlineはどういう構造のデータなの?
985デフォルトの名無しさん:2010/05/17(月) 01:38:52
Enumerable#eachとブロック引数を見れば明らか。
986デフォルトの名無しさん:2010/05/17(月) 01:56:34
Hashですね。
987971:2010/05/17(月) 02:00:49
死にたくなった
988デフォルトの名無しさん:2010/05/17(月) 05:07:44
ERROR:新このホストでは、しばらくスレッドが立てられません。
またの機会にどうぞ。。。
うひょう


プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
#>>2の「たのしいRuby」を第3版に差し替え

 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/


#>>4は本スレと前スレ更新、GUIと宿題追加

●関連スレ
Rubyについて Part 40
http://pc12.2ch.net/test/read.cgi/tech/1272248179/

●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/
Ruby 初心者スレッド Part 35
http://pc12.2ch.net/test/read.cgi/tech/1267668057/
Ruby 初心者スレッド Part 34
http://pc12.2ch.net/test/read.cgi/tech/1264635554/
990デフォルトの名無しさん:2010/05/17(月) 08:37:56
Ubuntu10.04でgemsをセットアップしようとすると

'requir' : no such file to load -- thread (LoadError)

と出て出来ないのですが、どうもthread.rbが無いみたいなんです。
間違えて消してしまったのかも知れませんが、

sudo apt-get install ruby1.9.1-full

をしてもインストールされない見たいです。どうすれば復旧できるでしょう?
991デフォルトの名無しさん:2010/05/17(月) 09:14:41
>>990
thread.rb は libruby1.9.1 パッケージに入っている。

fullを入れるとき、半端に残っている既存のRubyパッケージを消してから入れた?
インストールされている、という情報が残っているかぎり、
それが上書き再インストールされることはない。
992デフォルトの名無しさん:2010/05/17(月) 15:14:25
OSをアップデートで10.04にした人なんだろ
993デフォルトの名無しさん:2010/05/17(月) 21:25:24
>>991
いけました、ありがとう
librunby1.9.1ってなんか変なところにインストールされるんですね
994デフォルトの名無しさん:2010/05/18(火) 00:03:46
#rails hoge

#rake db:create

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
no such file to load -- mysql

ubuntuなんですが↑のエラーがでます

#sudo gem install mysql -- --with-mysql-config=/usr/bin/mysql_config

をやっても同じエラーが出ます
どなたか教えてください・・・
995デフォルトの名無しさん:2010/05/18(火) 02:10:27
落ちそうだけど質問いいですか?

falseか値がない場合は、
un ||= "unko"
とかできますが、
同じような感じで簡単に文字列の追加はできないもんでしょうか?

un << "unko"
では当たり前ですが aが nil の場合エラーがでます。

(un ||= "") << "unko"

とか考えたんですが、自分で書いておいてかなりギョットします。
996デフォルトの名無しさん:2010/05/18(火) 03:02:01
u
997デフォルトの名無しさん:2010/05/18(火) 03:02:47
m
998デフォルトの名無しさん:2010/05/18(火) 03:03:27
e
999デフォルトの名無しさん:2010/05/18(火) 03:10:57
http://www.youtube.com/watch?v=1qdlcfqTbDU
                   .,!'i、      ィ-,     ,,、_,,-.
                   /.イヘ,     | ,!     .| ゙ニ-i、,!
    ∩             ./,r'1.,/     | |_,,,,,.  .| 7'ニ",!             ∩
    | ゝ  <ヽ       ,/,,''y゙./  .r‐ー''",二,,,,7  | lニ-'',>       / >  く |
    / /   ヽ ∨     "゙.゙l"/   ゙'ー'"〔.|     | l'ッ ||i、      ∨ /    ヽ ヽ
   /  i    / /       .,/,l゙._,,.    |.|,-.   .,l゙,|"r゙lヽ'i、    i  ヽ    i  ヽ
  /  丿   /  ノ      丿 二i、 ゙l   |゙',―i、゙l   .l゙,タ-l |_゙‐'      ヽ  ヽ    ヽ  ヽ
 (   ヽ、 /  〈       /ノ! | .| l゙   .l゙{ .| |   ,l゙,!ィ'',",ニl゙      〉  ヽ /   )
  \  /'' ー'' ⌒`/ヽー、シ" .| ゙l,,,"]   ゙l.二__|  ,l゙,l゙,,,ニl゙.゙‐''''i、 --イ´⌒ ''ー ''\   /
    \/       〉   ⌒彡彡彡彡ミ     ミ彡彡彡彡⌒   〈       ヽ/
     ヽ   ,, -‐"      彡彡彡彡ミ   ミ彡彡彡彡       ゛‐- ,,   /
       \/      / ィ _彡彡彡彡   彡彡彡彡__ ィ \      ヽ/
        "ーーーー(,,___/つミ彡彡    彡彡ミとヽ___,,)ーーーー"  
        ( ========================)
         / ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄//_ //^\ゝ
        / ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄//_ ///== \ゝ
       / ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄//_. /// ‖  \ゝ
   A  ノ ̄ノノ ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄// ̄//  A_ノ//======== \ゝ .A
   .ヒ==,@==@,==@,==@,==@,==@,==@,==@,==@,==@,==@,==@ ノ人ノ     ‖      ン
    ̄‖~  ̄~ ̄~  ̄~ ̄~ ̄ ̄~ ̄~ ̄~ ̄~ ̄~ ̄~ ̄~ ̄~ ̄~ ̄~‖| ̄ ̄ .‖ ̄ ̄ ‖
     ‖============================================.‖|=====‖==== ‖
1000デフォルトの名無しさん:2010/05/18(火) 03:32:12
http://www.youtube.com/watch?v=1qdlcfqTbDU
            ∩
            | ゝ  <ヽ
.─ ────=≡/ /   ヽ ∨     
           ./  i    / /
 ───=≡.  /  丿   /  ノ      ズザーーーーーッ 見よ!わたしの華麗なダイブ
)⌒`)       (   ヽ、 /  〈
  `)⌒`)     \  /'' ー'' ⌒`/ヽー 、           
  ────=≡ \/       〉   ⌒彡彡ミミ\
  `)⌒`);;;`)⌒`)   ヽ   ,, -‐"      彡彡彡ミヽ
  `)`)⌒`)  )     \/      / ィ. _彡彡彡}
──=≡;;;⌒`)≡⌒)≡≡"ーーーー(,,___/つミ彡ノ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。