プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
バージョンに関するよくある質問 ・Ruby 1.8.5 レンタルサーバ等にいまだに残ってる非安定な古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい ・Ruby 1.8.6 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ ・Ruby 1.8.7 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に ・Ruby 1.9.1 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
Windows で Ruby を使う初心者はとりあえず ActiveScriptRuby の 1.8.7 をインストールして慣れろ
OneClickInstaller は単に古すぎ、RubyInstaller は MinGW32 版で現状扱い怪しい、cygwin 版は cygwin マニア専用
IDE のお勧めは特にない(せいぜい汎用のEclipseかNetBeans)、RDE は古くて独自すぎで Ruby に慣れた人向け
■ Windows でとにかく迷いたくない普通の人 … ActiveScriptRuby 1.8.7
ttp://arton.hp.infoseek.co.jp/indexj.html の題字のでかい 「ActiveScriptRuby 1.8.7(p249) with-winsock2 tcl-stub」
マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/ の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」
夢のお告げ等、何かの間違いで Ruby の知識がないうちから 1.9.1 を使って苦しみたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.1-p数字 Microsoft Installter Package」
○
>>1 乙 もうお前に用はない
く|)へ
〉 ヽ○ノ
 ̄ ̄7 ヘ/
/ ノ
|
/
|
/
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
前スレ
>>974 >「クラス < クラス」の場合はクラスメソッド(クラスの特異メソッド)も継承されるのに、
>「クラス < モジュール」の場合はモジュールの特異メソッドは継承されません。
「クラス < クラス」はクラスを継承してクラスを作っているからクラスメソッドは継承されるが、
「クラス < モジュール」のincludeやextendは継承階層的にはモジュールを継承しているが
作っているのはクラスだから特異メソッドは継承されない。
むしろモジュールクラスのメソッドがクラスクラスに継承されるほうが怖い気がする。
継承の仕組みを流用しているだけで、概念としてはモジュールの機能を組み込んでいる、だからincludeなんだ、と。
実際に継承しているのはモジュールじゃなくて化身クラスなわけだし。
どちらが正しいかなんて考えるのは馬鹿
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━-┓ ┃ ┌────────────────────────ーーー┐ ┃ ┃ │ / ̄ ̄\ │ ┃ ┃ │ / ヽ_ .\ │ ┃ ┃ │ ( ●)( ●) | ____ │ ┃ ┃ │ (__人__) | / \ .| ┃ ┃ │ l` ⌒´ | / ─ ─ \ │ ┃ ┃ │ . { |/ (●) ( ●) \ .| ┃ ┃ │ { / | (__人__) | │ ┃ ┃ │ ,-、 ヽ ノ、\ ` ⌒´ ,/__ .| ┃ ┃ │ / ノ/ ̄/ ` ー ─ '/>< ` ー─ ' ┌、 ヽ ヽ、 │ ┃ ┃ │ / L_  ̄ / _l__( { r-、 .ト、 . │ ┃ ┃ │ _,,二) / 〔― ‐} Ll | l) ).│ ┃ ┃ │ >_,フ / }二 コ\ Li‐' .| ┃ ┃ │ __,,,i‐ノ l └―イ ヽ | . | ┃ ┃ │ l i ヽl . | ┃ ┃ └ーーー────────────────────────┘ ┃ ┗-━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 平成22年5月18日 クソスレにて
前スレ994ですがスレ間違えました
,―ヽ_(((((_、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ IPA Rubyスレは誰でもウェルカム i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i |
http://www.youtube.com/watch?v=1qdlcfqTbDU ∩
| ゝ <ヽ
.─ ────=≡/ / ヽ ∨
./ i / /
───=≡. / 丿 / ノ ズザーーーーーッ 見よ!わたしの華麗なダイブ
)⌒`) ( ヽ、 / 〈
`)⌒`) \ /'' ー'' ⌒`/ヽー 、
────=≡ \/ 〉 ⌒彡彡ミミ\
`)⌒`);;;`)⌒`) ヽ ,, -‐" 彡彡彡ミヽ
`)`)⌒`) ) \/ / ィ. _彡彡彡}
──=≡;;;⌒`)≡⌒)≡≡"ーーーー(,,___/つミ彡ノ
前スレ
>>995 Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/995 995 名前:デフォルトの名無しさん[sage] 投稿日:2010/05/18(火) 02:10:27
落ちそうだけど質問いいですか?
falseか値がない場合は、
un ||= "unko"
とかできますが、
同じような感じで簡単に文字列の追加はできないもんでしょうか?
un << "unko"
では当たり前ですが aが nil の場合エラーがでます。
(un ||= "") << "unko"
とか考えたんですが、自分で書いておいてかなりギョットします。
前スレ読んで、ずっと悩んでいた文字化け現象の 原因が p249 のせいだったとは…!
webrickのWEBrick::Daemonで複数のサーバーを立てる方法ってありますか? server1 = WEBrick::HTTPServer.new({ :BindAddress = '127.0.0.1', :Port => 443, :SSLEnable => true, :SSLCertificate => OpenSSL::X509::Certificate.new(SSL_CERTIFICATE), :SSLPrivateKey => OpenSSL::PKey::RSA.new(SSL_PRIVATE_KEY), :ServerType => WEBrick::SimpleServer }) server2 = WEBrick::HTTPServer.new({ :BindAddress = '127.0.0.1', :Port => 80, :ServerType => WEBrick::SimpleServer }) Thread.new{server1.start} # サーバー起動 Thread.new{server2.start} sleep(1) while true WEBrick::SimpleServerの場合このコードで動きますがWEBrick::Daemonにすると server2が動きません。何か良い方法があったら教えてください よろしくお願いします
>>15 素直に二行で
falseじゃない場合に限れば
un = "#{un}unko"
無駄なオブジェクトができる?しらんがな
>>16 1.8.7-p249の文字化け(inspectのバグ)はFAQレベルのような気がする。
string.cを自分で修正してmakeすれば対応できるし、
次のバージョンアップ(1.8.8?)では修正されているらしいけど、いつリリースされるか分からないし。
「自分で修正して」のレベルなら次のパッチレベルリリースで直るでしょ
改行が \r\n のテキストに BB って行があるか調べるために正規表現を使う方法で、 "AA\r\nBB\r\nCC\r\n".match(/^BB$/) と書いたら nil になってしまって予想外だったんだけど これって match(/^BB\r?$/) とかわざわざ書かないとダメ?
>>22 Ruby あんま関係ないシリーズ絶好調だな
$ が何にマッチするかというと「\n の直前の幅 0 の隙間(と \n の直後の隙間)」だ
無理矢理可視化すると line1$\n$line2 みたいな感じ
\r は \n ではないので、/line$/ は "line\n" にはマッチするが "line\r\n"にはマッチしない
そんだけ
\r\n を改行フレーズとみなして $ が直前にマッチするようなマッチエンジンはけっこう特殊だと思う
…ああ、まずいなあ、改行文字という言葉を注釈なしで使ってる解説が多すぎる
ttp://www.ruby-lang.org/ja/man/html/_C0B5B5ACC9BDB8BD.html 正規表現の改行文字は \n のみ
irb> p /./ =~ "\r"
0
irb> p /./ =~ "\n"
nil
>>17 最後に WEBrick::Daemon.start してうまくいってないということなら、
最初にやってみたらうまくいくかも。
fork を発行したスレッド以外は殺されてしまうというあれ。違うかしらんけど。
ASR版がwin7のx64でインスコできないな どうにかならない?
jaとjpの違いって何? 前者が日本語で後者が日本国?
LOCALEのja_JPの意味としてはそう
もはや、なぜこのスレで尋ねたのかを説明してもらう必要があるレベルだなw
なぜwww.ruby-lang.orgのディレクトリはjaで、rubyist.netのサブドメインはjpなのか、 という質問かもしれないw
>>23 なるほどー。\r の存在はきちんと意識しとかないといけないんですね
改行を含んだ文字列を正規表現に含めるとき無意識に /AA\nBB(.*)/ とか書いてしまうんで。
jaは日本語、jpは日本国または日本国っぽい地域
Dir::globとDir.globって書き方の2種類を見かけるんですが同じ意味でしょうか? 後者はわかりますが(クラスメソッド)、前者の「::」がよくわかりません また、どちらを使うのが一般的でしょうか
後者 前者は忘れていいし、使ってる人がいたら陰で指差して笑え
クラスメソッドの :: はそろそろ無かったことにしたい表記だろうと思う 初心者スレ的には使う必要もないし覚える必要もないしこれ使ってるスクリプトを参考にする必要もない 素直にドットで接続すればよろし 保守されてるのはともかく、新しく書かれたライブラリでこれ使ってるのって無い…よね? :: でクラスメソッドを書いてるのは 1.6.x の臭いがするわん
def value(x, default='-') return x.blank? ? default : x end という関数を作ったんだけど、いい名前が思いつかない。 だれかよさげな名前を考えてください。
>>33 >>34 レス遅くなってすみません、ありがとうございます
もうひとつ質問させてください
クラスメソッド以外の意味で「::」を使うことはありますか?ある場合、どういう意味で使われるのか知りたいです
それともRubyでは「::」という記述はどういう意味においても今後使う必要のない記号なのでしょうか
Ruby では :: はクラスとモジュールと定数のアクセスに使う Net::HTTP とか これは :: を使わないと普通書けない というかそれくらいは適当な解説にでも書いてあるかと思う Ruby でいうところのクラスメソッドにアクセスするのに :: を使う言語があって、 それに似せておくとわかりやすいんじゃないかなーと Ruby の初期に考えられたことがあった それが尾を引いてる
>>37 なるほど、ありがとうございます
クラスメソッドとしてだけ使わない方がいいということですね
39 :
17 :2010/05/19(水) 17:29:36
>>24 レスありがとうございます
>最後に WEBrick::Daemon.start して
server1 = WEBrick::HTTPServer.new({
:BindAddress => '127.0.0.1',
:Port => 443,
:SSLEnable => true,
:SSLCertificate => OpenSSL::X509::Certificate.new(SSL_CERTIFICATE),
:SSLPrivateKey => OpenSSL::PKey::RSA.new(SSL_PRIVATE_KEY),
:ServerType => WEBrick::SimpleServer
})
server2 = WEBrick::HTTPServer.new({
:BindAddress => '127.0.0.1',
:Port => 80,
:ServerType => WEBrick::SimpleServer
})
WEBrick::Daemon.start{server1.start}
WEBrick::Daemon.start{server2.start}
とやってみましたがこれでは両方とも動きませんでした
>最初にやってみたら
これはどういう事でしょうか?
>>39 snip
Thread.new {server1.start}
Thread.new {server2.start}
WEBrick::Daemon.start
っていうスクリプトかと思ったんで
WEBrick::Daemon.start
snip
Thread.new {server1.start}
Thread.new {server2.start}
にしてみたらという話をした、だけ。前者だと fork を呼んだ == WEBrick::Damon.start を呼んだ
スレッド以外は死んでしまうから……というところで何で server1 は生きてるんだろうと悩んでしまった。
>>39 のスクリプトからするとそもそもスレッドは関係無かったのね。
こっちで server2 が動かない理由は簡単で、WEBrick::Damon.start が中で fork and exit! してるから
server2 を動かそうとしてる WEBrick::Daemon.start まで制御が行かないだけ。
>>40 fork and exit! してるから、じゃなくてその後にブロックがあったらブロックに yield してるから、か。
要するに server1.start; server2.start とやっても server2.start に制御が行かないのと同じこと。
42 :
17 :2010/05/20(木) 04:52:39
>>40-41 レスありがとうございます。なるほど、WEBrick::Daemonってそうやって使うのか・・・
WEBrick::Daemonってドキュメントに何も書いていないのでよくわからない(´・ω・`)
とりあえず下の方の書き方で
>>39 のサンプルは動くようになりました
でも、今作っているのはデーモンになってくれない・・・WEBrick::Daemon.startしちゃうと
エラーメッセージとか出なくなっちゃうからデバッグが面倒だ・・・もう少しがんばってみます
文字列の%qや配列の%wなどの記法って何由来ですか?あとこのアルファベットって何かの頭文字なんでしょうか なかなか覚えられなくて…
qはquote、wはたぶんwords 由来はない(Rubyオリジナル)なんじゃないかと思う
>>44 なるほど、納得できました
ありがとうございます
Perlのq//とqw//を踏襲したんじゃないのかな?
%はどっからでてきたの
parseに支障のない記号を適当に持って来たんじゃない
50 :
17 :2010/05/20(木) 21:29:08
自己レス WEBrick::Daemon.startするとカレントディレクトリが変わるのね カレントディレクトリを正しい場所に変更するようにしたら動きました
前スレの974です。
>>9 > 継承の仕組みを流用しているだけで、概念としてはモジュールの機能を組み込んでいる、だからincludeなんだ
この一文でスッキリしました。ありがとうございました。
実際モジュールメソッドが継承されてしまうなら、Mathモジュールをトップレベルでinclude
しただけで、すべてのオブジェクトからsinとか呼べるようになっちゃうわけですしね。
cd / は、デーモンになるときの作法の一部ですな。
指定した秒数(UNIX time)からn秒たったら処理を実行させたいのですが、どんな方法がありますか?
その時刻までsleep
自分は逆にn秒経ったら停止して欲しいと思って time = ARGV[0] t0 = Time.now t1 = t0 + time.to_i while t0 <= t1 do puts "Hello" t0 = Time.now end とやっているのですが(timeは引数じゃなくて中で指定してもいいのですが・・・) もっといい書き方ありますかね?一応自分の思った通りには動いているのでいいのですが・・・ twitterのstreamを指定時間DLしようと思ってタイマーをどうすればいいか書いているところです
puts "hello" を sleep(1) とかに変える
>>55 require "timeout"
Timeout.timeout(n) do
# some task
end
他スレでも質問したのですが返答頂けなかったのでこちらで質問します。 class Hoge def foo end end のように普通に定義されたインスタンスメソッドをHoge.fooのように クラスメソッドのように呼び出しているコードをしばしば見るのですが、 これはRubyの習慣なのですか? Javaしか知らない自分としては少し気持ち悪いのですが。
NoMethodError: undefined method `foo' for Hoge:Class
60 :
デフォルトの名無しさん :2010/05/22(土) 16:30:45
ExerbでWindows用の実行ファイルに変換したものが元のRubyスクリプトに比べ 同一マシン上で異様に高負荷となってしまうのですが何かFAQがありますでしょうか? 使用環境はWin XP SP3/ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]/Exerb 5.0.0です 使ったプログラムは #!/usr/bin/ruby require 'thread' require 'date' threads = [] threads.push(Thread.new{i = 0; loop do; puts DateTime.now.to_s + ' ' + i.to_s if i % 1000 == 0; i += 1; sleep 0.005; end}) threads.each{|t| t.join} sleepの値は適当に調整してRuby版でCPU負荷がほぼ0%となるような値を選択しました 私のマシン上ではRuby版が1000回転するのにおよそ16秒かかりその間負荷はほぼ0%でした 一方同一マシン上でExerbで変換したWin版では31秒かかり負荷はほぼ25%でした ためしに新たにThreadを起動せずメインスレッドで上記のループを回してみたところ Ruby版Win版とも1000回転に16秒かかりその間の負荷はほぼ0%となりもとのプログラムのRuby版とほぼ同じ結果が得られました このことからThread周りに原因があるのではないかと想像しているのですが 何か間違っている点あるいは回避策アドバイス等ございましたらご指南いただければと思います 現在Threadを使ったソフトを作っているのですがWin版のみ高負荷となってしまい 簡単なサンプルを作って確かめてみたという次第です よろしくお願いいたします
61 :
60 :2010/05/22(土) 16:48:07
ごめんなさい アップデートが出ていたんですね ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]/Exerb 5.1.0 にアップデートしたら問題解決しました テンプレをよく読まずにお騒がせしました
どんまい
スレッド内からスレッドの外にある変数を変更することは出来ますか?
Rubyのどんなスクリプトも、なんらかのスレッド内で実行されてるわけだが。 で、ローカル変数やインスタンス変数やグローバル変数はスレッドローカルではないので、 スレッドと関係なく変更できる。
なんだこの馬鹿は
ruby触り始めて2日目。OOP自体Rubyが(ほぼ)初めて。 ソケットと付随するデータを変数として持つクラスを作ったんですが 複数生成したインスタンスのIO多重化をIO.selectで行い結果を受け取った後でそのソケットが属するインスタンスをどうやって取り出したらいいかで詰まりました。 読み出しができるソケットを持つインスタンスを取り出したいというのが目的です。 何かいいやり方はありますか? もしくは設計自体がまずいでしょうか?
self
ダックタイピングなRubyがOOPとは 個人的には言いたくない どちらかと言うとC++のテンプレートに近い
>>67 不勉強なせいかまだよくわからんです。
class Hoge
def initialize(foo, bar)
@s = TCPSocket("localhost", 2000)
@foo = foo
@bar = bar
end
attr_reader :s
end
hoge = Hoge.new("foo", "bar")
ret = IO.select([hoge.s])
ret[0].each do |s|
#ここをどう書く?
end
>>69 Hoge に alias to_io s して、Hoge を IO のように扱えるようにしてから
IO.select に渡すのを hoge.s でなく hoge そのものにする。
または、ソケット→Hogeインスタンスなハッシュテーブルを持っておく。というのはどうかな。
ありがとうございました
なんだこの馬鹿は
素朴な疑問なんだけど どうしてRubyはBooleanクラス作らなかったの? 単純に不要だったからって理由? trueとfalseの親がまんまObjectって言語他にあったっけ
TrueClass と FalseClass があればいらん、と判断したんじゃないかなぁ。 falseもnilも偽だし、それ以外は全部真だから、わざわざBooleanを作る意味が あまりないし。
>>75 ありがとうございます。
やっぱりそうなのかな…
そういえば明示的にtrue書くこと自体あまりないですね
>>68 ダックタイピングだからOOPじゃないってことは流石に意味不明だろ。
SmallTalkだってダックタイピングだし、新しいGoもダックタイピングを全面に押し出してる。
Java流(静的言語流?)OOPじゃないってのが正しい言い方。
しかしJavaのインタフェースすらも、ダックタイピングに制限を加えた
形だと見ることができる。
78 :
77 :2010/05/23(日) 12:06:49
x ないってこと o ないっての
>>74 すべての比較演算子にtrueとfalseでは違う挙動するから、親クラスは必要ない。
Javaみたいにif式がbooleanしか受け取れないみたいのもない(ダックタイピング)だから
やはり親クラスは必要ない。
trueとfalseでは挙動が違うのだから、TrueClassとFalseClassは必要。
比較演算子じゃなくて論理演算子だった。ゴメン。
>>77 継承関係関係なしで多態できてしまうのはちょっとねえ、と
まあ動的型付けじゃ仕方ないけど
OOPはそれだけのものじゃないから
まあ部分的にはOOPと呼べるけど
継承が(仮に)なくてもOOPはOOPなんだし
部分と全体が逆になってるような気がする
booleanがないんじゃなくて、全てがbooleanなんだお
>>68 や
>>81 を見てデザインパターンを覚えたばかりの頃に無駄に継承したくなった過去を思い出したw
>>81 > 動的型付けじゃ仕方ない
むしろダックタイピングのために動的型付けになってる(特にRuby)
> 部分的にはOOP
>>83 も言ってるけど、静的言語のOOPがダックタイピングOOPの特殊例。
ってか多態性はOOP3大機能のひとつなのに、なんでそれを制限する静的型付けの方
が全体になるのかわからん。
>>85 それはあるw
どっちかというと、C++やJavaをオブジェクト指向言語と呼ぶのに抵抗がある
別に厳密な定義があるわけじゃないし、自身がそういうならそうなんだろうけどさ
>>68 みたいなのを生み出す要因になってるよね
本来クラスよりインスタンスの方が重要なんだけど、あの辺の言語に染まっていると
クラスがオブジェクト指向の本質だと思い込みがち
ちょっとライブラリの質問です。
Rubyのちょっとしたスクリプトで、エラーというか例外が起きて中断されたような場合に
メールを送ってくれるようなRubyGemsで入れられるようなライブラリはありませんでしょうか?
Railsでは以下のものが見つかりましたが、Rails依存があり素のRubyスクリプトではそのままで使えないようです。
rails's exception_notification at master - GitHub
http://github.com/rails/exception_notification
>>88 ライブラリは知らないけど、全体をbegin 〜 rescue Exceptionで括って一般的なメール送信方法を行えばいい
構文エラーが予想されるときは該当部分(スクリプト本文)を別の.rbファイルにしてbegin内でrequireもしくはload
たぶんtDiaryやHikiあたりが参考になる
エラー発生時に例外処理でエラー文をアウトプットしてるから、それをメール送信処理に差し替え
90 :
88 :2010/05/23(日) 16:51:14
ありがとうございます。hikiのtrunkのソースのwebrickでの処理を見ていたんですが、 rescueで例外処理をトラップしてメッセージやスタックトレースを表示しているだけなんですね。 これをメールで送ればいいと。 misc/webrick/hikilet.rb:95: rescue Exception => err res.status = 500 res['content-type'] = 'text/html' res.body = [ '<html><head><title>Hiki Error</title></head><body>', '<h1>Hiki Error</h1>', '<pre>', CGI.escapeHTML( "#{err} (#{err.class})\n" ), CGI.escapeHTML( err.backtrace.join( "\n" ) ), '</pre>', "<div>#{' ' * 500}</div>", '</body></html>', ].join('') end ついでにログ残せたらなと、log4rやloggingというライブラリを見ていたら ログをメール送信する機能もありましたので、そちらも合わせてみてみたいと思います。 ありがとうございました。
>>79 >すべての比較演算子にtrueとfalseでは違う挙動するから、親クラスは必要ない。
なんでやねん
>>87 >本来クラスよりインスタンスの方が重要なんだけど、あの辺の言語に染まっていると
>クラスがオブジェクト指向の本質だと思い込みがち
これJavaから入った自分には耳が痛いのですがw、ダックタイピングとポリモーフィズムって厳密な違いはなんですか?同じこと?
93 :
15 :2010/05/23(日) 19:37:55
>>18 > un = "#{un}unko"
代入時と同時に未定義のunを式展開で使う場合はエラーでないですね。初めて知りましたw
あ、でもfalseの場合は "falseunko"になるのかー。
気になってirbで確認したのですが、代入しないとやはり未定義だとエラーでるんですね。
irb(main):001:0> "#{un} unko"
NameError: undefined local variable or method `un' for main:Object
from (irb):1
ローカル変数unでなくフィールド(?Rubyだとなんというでしたっけ?)の@unの場合は未定義でもいけるんですね。
> un = un << "unko"
だとやはりエラー出ますし、これって評価のタイミングなんですね。
可読性やfalseの時も考えると、2行でいいかという気もしますし、
キモいのが嫌ならコメントつけるなりメソッド化してみます。
ありがとうございました。
>>92 ポリモーフィズムはもっと概念的な話で、名前空間の親戚
javaで継承やinterfaceを使わなくてもメソッド名が同じならポリモーフィズム
>>93 一度も使われていない可能性のあるローカル変数を呼ぶ、という事態そのものが不自然
if false then un = 1 end
p un #=> nil
プログラミング言語Rubyを読んでいるのですが、 オブジェクトoがStringクラスのインスタンスであることを確かめるために、 o.class == String というコードが書かれています。 この場合の==演算子ってClassクラスのインスタンスメソッドって認識で合ってます? どういう条件で真偽を返してるのでしょうか。
97 :
95 :2010/05/24(月) 01:08:18
>>96 ご丁寧にありがとうございます。
ただまだ分からない点があります。
Object#==をそのまま引き継いでるとすると、
o.class == String
は常に偽になってしまいそうに思うのですが、
考え方が間違ってますか?
oがStringのインスタンスだったとしても、
o.classとStringは同じクラスですが異なるオブジェクトですよね?
StringはClassインスタンス o = ""とすると、oはStringインスタンス o.classは「Stringインスタンスのクラスのオブジェクト」、つまりStringオブジェクトそのもので ClassインスタンスでありStringという定数(ここポイント)の値と同一 おまけ obj = Object # 定数だから値を読み出したりそれを代入することができる o = obj.new # その値(Objectオブジェクト)を使ってnewもできる o.instance_of? Object # 当然Objectのインスタンス
おまけ部分の肝心なところを忘れてた class C; end C = Class.new この二つはほぼ同一(厳密には微妙に差があったかもしれない) 本題にも蛇足しとくと、p Stringとかp o.classとか さらにそれらのObject#object_idとか確認してみるといいかもね
100 :
95 :2010/05/24(月) 02:22:52
度々ありがとうございます。とても勉強になりました。 なるほど、String定数自体は一つだから同じオブジェクトになりますね。。
Rubyレシピブック第二版で文字列操作の章を読んでると、「マルチバイト文字は扱えません」と注意書きされたメソッドが結構でてきます(ex. deleteやchrなど) これって今の最新のRuby(1.9?)でも同じすか? 改善される予定はあったりしますか?
1.9 では大幅に変わった。バイト列じゃなく、文字を扱うようになった。 chrはエンコーディングを付けることでマルチバイトに対応 例 12354.chr("UTF-8") deleteもたとえば "あいうえおあお".delete "あ" とできる。
言語はどれほど重要ですか?
104 :
101 :2010/05/24(月) 09:51:11
>>102 おお、これは嬉しいですね!
日本語で使えないやつばっかりじゃん、とちょっとガッカリしてましたが、頑張る気になれました
ありがとうございます
1.9使うともっとガッカリできるぞ
106 :
101 :2010/05/24(月) 10:05:35
1.9でテキスト処理すると、理解不能なエラーが出てきてforce_encodingだらけになるからね
んなわけない。アホか。
前に試した時は謎のASCII_8BIT文字列が出てきたり大変だったよ 今もRailsの人が困ってるようだけど
質問です。 Rubyでインスタンスメソッドがあるかないかを確かめる方法は以下の方法でよいものでしょうか? Unkoクラスをインスタンス化した場合にseeds_of_watermelonメソッドがあるか確かめたい場合は >> Unko.instance_methods.include? "seeds_of_watermelon" => true でよいでしょうか? define? Unko.seeds_of_watermelon だと、クラスメソッドで判定されてしまいます。 もちろん define?をUnkoのインスタンスに使えばいいのですが、 その場合インスタンス化する前に知ることができません。 何でこんな疑問がうかんだかといいますと、Railsのプラグインがあるモデルに組み込まれているかどうかを確かめる方法が知りたかったのです。 例えばRailsでは大概プラグインは必要な時に自動でincludeされ、 モデルのクラス定義で acts_as_nantoka として実際のモデルごとに組み込むことがあります。 Ruby的(ダックタイピング的)には、acts_as_nantokaが呼ばれたか?というよりも 実際にメソッドがあるかないか?で判断した方がよいと思ったためです。
RVMsugeeeeeeeeeeeeeeeeeeeeeee
>>110 method_defined? というのが使えます。
class Foo
def hello
puts "Hello"
end
end
Foo.method_defined?(:hello) #=> true
>>110 そういう用途なら respond_to? が適切と思う。
if obj.respond_to?(:seeds_of_watermelon)
obj.seeds_of_watermelon
end
rubyって+とか-もメソッドなんですよね? 1 + 5 って式は、1.+ 5って書くべきじゃないの? どうしてピリオドが無いのにエラーにならないの?
ピリオド付けたければどうぞ
糖衣構文だな ピリオドあったら変だしめんどくさい
>>113 おまえは
>>110 の
>その場合インスタンス化する前に知ることができません。
が読めんのか。バカなの?
こういう、明後日の回答をえらそうにする上級者がすげーきらい。
上級者は明後日の回答はしませんことよ
119 :
デフォルトの名無しさん :2010/05/25(火) 08:55:09
適当な答えで からかうことはある
>>114 演算子は、構文解析時は通常の演算子として解釈され、
実行する時はメソッドとして動作する。
ただそれだけのこと。
121 :
110 :2010/05/25(火) 14:24:33
>>12 サンクソ
Unko.method_defined? :seeds_of_watermelon
でインスタンスメソッド有無判定いけました。
>>113 >>117 レシーバーがインスタンスの場合はrespond_to?でいけるんですね。勉強になりました。
ありがとうございました
122 :
110 :2010/05/25(火) 14:35:44
Railsのドキュメントをついでに読んでたんですが、 動的に評価されるメソッド、例えばActiveRecordでいえば dynamic filnderやdyanamic scopeを使うときは method_defined?では引っかからないようで、 その辺が考慮されてるrespond_to?を使うのがよいようです。 注意した方がいいかと思います。 >> Unko.method_defined? :find_by_id => false >> Unko.respond_to? :find_by_id => true
>>122 Unko.method_defined? :find_by_id
がfalseなのは、method_defined? がインスタンスメソッドを調べるものなのに、find_by_idがクラスメソッドだから。
今日からお前はルビ夫だ。
Hashのエントリを複数削除したいときはHash.deleteを複数回実行しないといけないですか? 引数は1つか取らないのでなにかうまいやり方はないですか?
じゃああたしルビ子ね。と書こうと思ったがそれは結城さんだっけ。
>>125 hash.delete_if {|k,v| list.include?(k) } くらいかのー
keys = [:a, :b, :c] hash.reject!{|k,v| keys.include? k } 結局ループするなら keys.each{|k| hash.delete k } でいいじゃんと思う
129 :
125 :2010/05/26(水) 17:25:03
>>127-128 投稿後,条件にあるものだけコピーすればいいじゃん!
と思っていましたが,うまく行きました.
なんで,deleteが複数引数とらないんだろう・・・・
ぶっちゃけいらね、ループやdelete_ifで事足りない状況のほうが稀だし
>>129 だって結局いらなかったんだろ?
>>129 >なんで,deleteが複数引数とらないんだろう・・・・
同意する。delete_allとかあっても良さそうなもんだけどね。
ハッシュの delete_all ってなんか意図しない削除が起こりそうで恐いよw たまたま同じ値を持ってた削除されるべきでないエントリまで誤爆で削除しそう
133 :
110 :2010/05/26(水) 23:41:08
>>122 x dynamic filnder
o dynamic finder
>>123 > find_by_idがクラスメソッドだから。
あれ?
singleton_methosで出てこないような
>> Hoge.singleton_methods.include? "find"
=> true
>> Hoge.singleton_methods.include? "find_by_id"
=> false
>> Hoge.find_by_id Hoge.first.id
=> #<Hoge id:1 (以下略)
concatとか破壊的メソッドなのに!が付いてないのがあるのはどういう基準ですか?
>>134 !ありとなしの両バージョンを用意するならば、 より注意が必要なほうを!ありとせよ、という基準。 破壊的かどうかとは必ずしも一致しない。 concatは1バージョンしかないので!を付ける必要がない。
>>135 あぁ、そういう基準でしたか
!は破壊
?は真偽
と勝手に思い込んでました
ありがとうございます
常に破壊に!を付けるなら 代入も!=になっちゃうぞ
もうひとつ質問させてください 配列aとbを連結して新たな配列cを作りたい。ただし、aとbは破壊しないこと。という場合 c = a.clone.concat b と書くのが最小でしょうか? concatが破壊しなければ(2つあれば)、スマートに書けたのになぁというのがさっきの質問につながっています レファレンス見た限りそれっぽいのはなさそうでしたが、もっと簡潔に書けたりしますか? と、ここまで書いてから c = a + b が頭に浮かびました。Rubyさん素晴らしいっす…
図工
ptn="(あ|い|う|え|お)" scanv = Array.new if (条件式) then scanv = "かあきくけこ".scan(ptn) end これでscanvがnilになってしまうのですが、原因分かりますか? ちなみにputs "1"などとして条件式がtrueになることは確認しました。
>>140 scanに渡してるのが正規表現でなく文字列になってるよ
一度マニュアル読むべき
gemから取得したJSONを使って遊んでいるのですが、 取得したデータを一旦JSONファイルにして(例えば {"name":"ORE","text":"ひまなう"} とかいった内容) 別のプログラムからそのファイルの一行一行をJSON.loadしていっているのですが、 load後の日本語の末尾が \343\201\206とかになってしまいます。ひまな\343\201\206 のように JSONファイルはUTF8、プログラム内ではとりあえず、文字コードは指定していません。 吐き出しているJSONファイルではちゃんと日本語がみれるのでloadの時に何か起こっているとは思うのですが JSONではないデータにすればいいのかもしれませんが、どーしても気持ち悪くて解決したいのですが 何が起こっているかわかりますか?よければ対処策を教えてもらえますか?
>>142 文字列の最後の1文字だけが化ける状態なら、
ruby 1.8.7-p249の p (というかString#inspect)のバグ。
実データがおかしくなっているわけではない。
putsしてみて。
state = "福岡|熊本|大分|宮崎|鹿児島" val = kyushu.scan(/#{state}/u) とすると、 ["福\345\263\266"] となります。実行するときに-Kuとしているのですが、なぜでしょうか?
>>145 真上にあったのに気がつきませんでした。ありがとうございます
このバグはやくなおしてほしいね
>>143 まさにそのバージョンです。ありがとうございます。
テスト出力の時はpまたはppを使ってましたので気がつきませんでした。
>>147 さんが言ってるように早く直してほしいですね。
自分も
>>148 と同じようにruby 1.8.7-p249だった。
うぶんちゅ10.04でruby1.8.7のデフォがp249か・・・
ruby1.9やruby1.9.1だとsqlite3-rubyつかったらもじばけすんし・・・・
自分でビルドするしかないかな・・・
sqlite3-rubyも1.9のエンコード対応完了版はあるんだが、 まだリリースされてないからな……
解析したリストを作ってそのリストに載っていないファイルを解析しようと思ってます。 解析したリストの配列とそのディレクトリの中にあるファイルのリストの配列を作って その差分ではみ出したモノを解析して、解析が終わったら解析したリストに追加。 というモノを書いているのですが、 ディレクトリには1.dv 2.dv 3.dv 解析済みのリストlistには 1.dv 2.dv が入っています 中身をコピーしたファイルを新しいファイルとして*.bbbと作るようにしています. しかし、新しいファイルが作成されません。見てもらってもよろしいでしょうか? endfile_list = Array.new File.open("list") {|f| while l = f.gets endfile_list << l.chomp end } filelist = Dir::glob("*.dv");fileanaly = filelist -endfile_list File.open("list","a") {|ll| ll.puts("\n#{fileanaly}")} fileanaly.each {|dd| File.open("#{dd}") { |abc| addlist = "#{dd}.bbb" File.open("#{addlist}","w") { |de| while aaa = abc.gets de.puts("#{aaa}") end }}}
3.dv.bbb なら普通に作成されたけれども。 あと fileanaly.join("\n") じゃないか?
>>152 ほんとですね。もう一度やったら作成されました
末尾にjoinすればOKっすね。ありがとうございます。
>>153 末尾にjoin?
152で指摘しているのは
× ll.puts("\n#{fileanaly}")
○ ll.puts(fileanaly.join("\n"))
てことじゃないのか
&&と||の優先度は違うのに どうしてandとorの優先度は同じなの? 色んな状況妄想して考えてみてもこの仕様の意図が分からない。
記号の方はC由来、and/orは a() or b() and c() が直観と同じ順序でコールされるようにってことじゃないか? 優先順位最低のand/orに上下関係がないからこそ 順位から開放されて限りなく文に近い存在になっているとも思う
記号の由来はPerlじゃないのかなあ でも、ぐぐるとandのほうが高優先度らしいんだよね
>>157 Perl由来で合ってるし、Perlも&& ||は優先度が高く、and or の優先度は低い。
まちげーた。andとorの間の優先度か。 Perlはandのほうが高いな。
どの言語でもandとorではandの方が高いのが普通だ
じゃあ&&の優先度も||より高くすべきだな
>>161 どの言語でもそうだろ
Prologみたいにandやorがデフォルトで用意されていなくて
自分で好きに優先度指定できるというケースはともかく
p(true && true || true && false) → true
p(((true && true) || true) && false) → false
p(true && true || false && false) → true
p(((true && true) || false) && false) → false
うん、いやだからrubyも&&の優先度を||より高くすべきじゃないかと。 java辺りから来た人は絶対間違えるだろ。 エラーが出ないわけだし原因不明のまま時間が経って埋もれてしまうこともあり得る。
ああ間違えた&&と||じゃなくてandとorの話ね。
Rubyでも && > || だという話なんだが
って、and/or 演算子の話をずっとしてたのか 最初から読んでなかった すまん
Javaから来た奴は&&と||使うだろうから間違うことは無いだろ 敢えてand/or使う場合は仕様ぐらい確認するだろうし
いや、and/or は優先順位があるだろう、という先入観はあるだろ。
そんなくだらん先入観にも対応しなきゃならんのか
JavaとRubyは別物だよね? だったら、それぞれの言語を使うときは言語仕様を調べるのが当然だと思うけど。 使う人間の先入観とかどうでもいいわ
じゃあ、 3 + 4 = 12 3 * 4 = -1 3 / 4 = 7 3 - 4 = 0 のような演算子を定義しても問題ないな
言語仕様として明記されているのであれば、問題ない。 その言語仕様を見て使う気になるかどうかは利用者次第だけど。
C言語プログラマが全員JIS X 3010の規格票を持ってるかというと そんなことはないわけで。
ネットで普通に見れるけど
+ - * /の対応はかなり直感的だから、特段の理由なしにそれを裏切るのはよろしくないが and orの優先順位はそこまで直感的でもないからな。その違いは大きい。 細かいところが言語ごとにちびちび違っててうざいんだよという主張は分かるが。
Pascalから移行したときに pascalのつもりでand or 使ってたら、意図と違うけっかになりまくったな。 && ||に置き換えたら何事もなく。 当時のことはよくは覚えていないが、優先順位だったのか。
まあ正直&&/||やand/orあたりは 優先順位に頼らず括弧をつけるようにしてるので 何事も無いけどな
改行が含まれる文字列同士を比較してdiffの結果みたいな文字列を得るライブラリがないかと思い、 gem search diff すると37個マッチしました。 $ gem search diff -r | grep -i diff adamsanderson-ruby_diff (0.2) alexyoung-rsyncdiff (0.0.2) algorithm-diff (0.1) artemv-diff_to_html (1.0.3) briandoll-rails_framework_diff (0.0.1) ※全部で37行 名前から推測・除外しつつ自分で一つ一つ試していく方法以外に、 目的のライブラリに早く辿りつくコツなどはないでしょうか? できれば、ただ目的にあったものを見つけるのではなく、 ・テストがしっかり書かれている ・コードが綺麗 ・メンテナンスされている ものを探し出したいです
>>179 意図とはちょっとずれるけど、おれもdiffのいいライブラリが知りたい
あんまりいろいろ入れたくないので、cucumberが依存しているdiff-lcsだけ入れてる。
182 :
デフォルトの名無しさん :2010/05/31(月) 22:53:30
GzipReaderオブジェクトってflockできないけど GzipReaderでファイル読む場合flock(LOCK_SH)しなくていいの? f = open(file) f.flock(LOCK_SH) g = GZipReader.new(f) しろってこと?
>>179 結果的にはよくわからなかったがレス
俺のRubyGems探すときのパターン
RubyGemsで主流っぽいものを探すときは、まずはRuby Toolbox探すと
ジャンル別によく使われているのがさがせて楽・・・
The Ruby Toolbox - Know your options!
http://www.ruby-toolbox.com/ なのだがサイト内検索してもdiff関連のものはなかった
それとRubyGems.org だとダウンロード数順で検索もできるので、
search | RubyGems.org | your community gem host
http://rubygems.org/search?query=diff ・・・と目立ったのはdiff-lcsくらいか
あとは"ruby diff" とか "ruby diff github" とかでググてgithubで新しい目のものを見つける
(見つかりにくい時は googleで”1年以内”の範囲とかで検索したりする)
でも、結局diff-lcs以外特によさそうなの見つからんな・・・
力になれずスマソw
あと、gem search diff で "-" がついているものはgithubのものが含まれている可能性が高い
ので注意な(-dつけて詳細表示したら Homepage: の欄でわかるはず)
今はgithubはRubyGemsの生成やってなかったと思ったが、以前にgithubがgem作れたときのものが
ユーザー名-プロジェクト名
みたいな感じでgemが作られて残っている(今はrubygems.orgに移行してるはず)
>>179 ついでにrspecやcucumberは差分表示のオプション合ったと思って依存gem調べたんだが、
>>181 の通りdiff-lcsって奴だったわ
とりあえず diff-lcs 試してみたらどうかなあ
diff-lcsが目立ってるのは単にcucumberと一緒に入ってくるせいだろうから、 評判がよいとは限らないところが気になるけど。こればかりは使って試すしか。
186 :
179 :2010/06/01(火) 11:13:55
>>183 今までライブラリ探すときは gem search だけを使ってたんですが
紹介していただいたサイトではなんとダウンロード数やスコアまで出てるんですね。
どこでスコアなどを管理しているのかわかりませんが、
もし gem と連携できるなら gem search でオプションつけてダウンロード数やスコアまで出して
ソートしてくれたり、個人的な贅沢な希望としては「何に依存させているか」みたいな情報も
まとめてサクッと出ると嬉しかったりします。
が、とりあえずは、diff 以外でもライブラリ探しに苦労したりするので、
Ruby Toolbox などのサイトの存在を知れただけでも助かりました。ありがとうございます。
diffの方はdiff-lcsから試してみます。
UUIDを生成するクラスくらい標準でついてて欲しいんですけど。
>>188 ほんとだ。標準ではないのか。
これはたしかに標準でほしいよなあ。
ほかに標準で欲しいライブラリってなにがあるかな。
JSONパーサが1.8.7でまだ標準じゃないのにはがっかりだ。
190 :
デフォルトの名無しさん :2010/06/02(水) 00:28:14
範囲を現すリテラルの「..」と「...」ですが、直感的には点が多いほうが終了位置を含むと思ったんですが実際は逆でした 1..5 #5を含む 1...5 #5を含まない これって何か納得できる理由とか、何かの影響でこうなったとかありますか?
直感っていうのは人によって違うからなんともいえないな。 1..5は自分にとっては、5を含むのが自然と感じる。
リテラル自体は、まあたぶん例によってPerl由来 Perlにも二つ点と三つ点があるんだっけ? 挙動の違いは……Perlerを召喚しないとちょっと分からんが
少なくとも昔のperlに三つはなかった perlのは以下だから、未満はruby拡張ということなんだろう
Perlの3ドット ... はラクダ本初版(4.019対応)で見た気がするけどな。
よく使う方が短くあるべきとか
196 :
194 :2010/06/02(水) 02:00:48
Perl 4.036のソース取ってきてman見てみたが .. しか載ってなかった。 俺がPerlを使わなくなる以前には ... は存在してたから、5の初期かなぁ。
197 :
194 :2010/06/02(水) 02:17:30
気になったのでもう少し。 5.003_97e に "Mention '...' operator in precedence table" というのがあった。 ドキュメントに追記したってだけなので、実装はそれ以前なのだろうな。 ellipsisとしての ... が多すぎて探せやしねぇ。
終点じゃなくて始点を含めない版がほしいときがある
二つの点の次が終点 1..5なら5まで 1...5なら.まで。ここで.は後続の5の一つ前の値4
なんでやねん
>199 ありがたや。これでもう迷わない
>>186 rubygems.orgの検索の方はダウンロード数でソートされてるけど、
>>185 もいうように、diff-lcsでいえばcucumberやrspecの依存関係になってて
意識せずに一緒にダウンロードされてるはずだから、評判がよいとは別か
Ruby Toolboxの方は、githubで開発がさかんかどうかみたいなのも評価対象みたいだ。
確かにgemコマンドでRuby Toolboxみたいなスコア出すオプションあって、
ソートしたりできても面白な
AutoCADのAddTextサンプルコードと同様のことを WIN32OLEを使ってやろうと考えています。 VBAサンプルコード Sub Example_AddText() Dim textObj As AcadText Dim textString As String Dim insertionPoint(0 To 2) As Double Dim height As Double textString = "Hello, World." insertionPoint(0) = 2: insertionPoint(1) = 2: insertionPoint(2) = 0 height = 0.5 Set textObj = ThisDrawing.ModelSpace.AddText(textString, insertionPoint, height) End Sub --------------------------------------------------- require 'win32ole' textString = "Hello, World." insertionPoint = WIN32OLE_VARIANT.new( [2, 2, 0], WIN32OLE::VARIANT::VT_ARRAY) height = 0.5 ac = WIN32OLE.connect('AutoCAD.Application') ac.ActiveDocument.ModelSpace.AddText(textString, insertionPoint, height) --------------------------------------------------- C:/dev/ruby/confirmation/rbB0.tmp:7:in `method_missing': (in OLE method `AddText': ) (WIN32OLERuntimeError) OLE error code:80070057 in <Unknown> <No Description> HRESULT error code:0x80020009 例外が発生しました。 from C:/dev/ruby/confirmation/rbB0.tmp:7:in `<main>' Complete(1)
逆引きRubyのトップの意味がわからず使い方がわかりません。 house for sale in eaton ohioとはどういう意味なのでしょうか?
どうみてもwiki spam
>>204 スパム
スパムフィルターみたいなのとかcaptchaとかついてないのかね
戻そうと思ったんだが履歴ないからわからん。他のwikiみたいに履歴見れないの?
うわ。俺がさっき直したのに、もう差分も残ってない... 絶え間なく書き込み攻撃くらってるなこれ。
スパムフィルタのないwikiを認証なしでネットで運用することは 裸でブエノスアイレスを歩くことに等しい hikiだっけ?スパムフィルタプラグイン(captcha推奨)とか認証プラグインないの? 手っ取り早い方法はhttacessとかでPOSTだけでもBasic認証かければいい
スパムだったのですね、危うくURL踏むところでした。ありがとうございます。
210 :
203 :2010/06/03(木) 20:48:25
どうすればVBAで配列を渡しているところを、 RubyのWIN32OLEで渡せるか教えて下さい。 ruby は 19.1 です。
>>208 なくもないけど、逆引きRuby自体、今よりのどかな時代に作られたもので、
設置した本人もHikiの開発自体から遠ざかって別の人が引き継いでいるような
状態なので、気付いていないんじゃないだろうか。
あ、補足。 逆引きRuby Wikiのあるnamaraii.comのたけうち氏がHikiの原作者です。
>>210 insertionPoint = WIN32OLE_VARIANT.new( [2, 2, 0], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8)
かな?
AutoCADのことは知らないけど
裸でブエノスアイレス歩くとどうなるんですか
>>214 ご安心下さい。サッカーのワールドカップやる予定のような国なので、
別に危険はありません
superclass メソッドの名前はどうして super_class じゃないんですか?
マジでか
そうだったのかー 間違えたけどいまさら直せなくなってるのかと思ってた
super classだと・・・「特上クラス」?
Windowsにてrmagickをインストールしたのですが、
require 'rubygems'; require 'rmagick'するとエラーがでて使えません
プロシージャ エントリ ポイント SelectiveBlurImageChannel がダイナミック リンク ライブラリ CORE_RL_magick_.dll から見つかりませんでした。
インストールには
http://rubyforge.org/frs/?group_id=12&release_id=39888 のrmagick-win32にあるRMagick-2.12.0-ImageMagick-6.5.6-8-Q8.zipをダウンロードし、
中の rmagick-2.12.0-x86-mswin32.gem を
gem install -l rmagick-2.12.0-x86-mswin32.gem
してgemをインストールしつつ同梱の
ImageMagick-6.5.6-8-Q8-windows-dll.exe
をインスコしました。
aruy.net ≫ Blog Archive ≫ RMagickをインストールした。
http://aruy.net/archives/221 を参考に念のため
Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)とSP1用のものもインストールしてみたのですが
同じエラーがでてしまいます。
何か対処法はないものでしょうか?
221 環境書き忘れました ruby 1.8.7 win32です
223 :
221 :2010/06/05(土) 02:15:12
>>221-222 ruby/bin の中に旧バージョンの CORE_RL_magick_.dll 等のImageMagickのDLL
が入っていたようです。
削除したらうまくいきました
ImageMagick-6.4.8-Q8のDLLがごっそり入っていたようです。
なんでかはわかりませんが、
ImageMagickを別途インストールしてパス通すのが面倒くさくてコピーしてたのかもしれません
224 :
203 :2010/06/05(土) 13:53:52
Rubyでキーワード抽出のライブラリありますか? 言語処理で遊んでみようと思ったのですが、検索しても PERLのLingua::JA::SummarizeやTermExtractばかり引っかかってしまいます。 そこの処理の部分だけPERLで書くのもRuby勉強したばっかで辛いです.
>>225 形態素解析って奴だろ?
chasen,kakasi,mecabとか
形態素解析から一歩進んで、自動要約みたいなことをやりたいんじゃないかな? 自動要約Rubyで検索すると論文が1個ひっかかるけど、その研究者のサイトは今つながらないみたいだ。
Enumerableってなんて発音してる? いなむれーぶる? えにゅめらぶる? 正しさより、Ruby界隈でのメジャーな発音知りたいな
いにゅめらぶる
イーナムイレイブル?
稲無 選ぶれ
Base64のライブラリってどうなっちゃったの? =?iso-2022-jp?B?〜はもう変換できないの?
require 'base64' できると思うけど? nkf の -m オプションは今でもデフォルトだけど?
それがダメなんですよ 昔は行けたのに
どのバージョン?
1.9
俺の環境で ruby19 -v -rbase64 -e 'p Base64.encode64 "foo"' ruby19 -v -rnkf -e 'p NKF.nkf "-w", "=?ISO-2022-JP?B?GyRCJCIbKEI=?="' どちらもできてるけど?(nkfのオプションは端末の環境に合わせて)
てか、できないってどうできないんだよ。 エラーでてるならエラー書けよ
今環境無いんであれだが
Base64.decode_b("=?iso-2022-jp?B?〜
ってやると、んなメソッドねーよ的なメッセージが出た
nkf使えば良いのね。試してみる
サンクス
>>237
てst
rubyのFloatは、仮数部の精度は10進数で何桁分ありますか。 unix timeをfloatで表現したとして、小数点以下何桁まで指定可能かを知りたいです(意味があるかどうかは別にして)。
そのマシンのC言語のdoubleと同じ、じゃないかなぁ?
知らんがな
Integer使っていれば勝手にBignumが使われるわけだけど なんでわざわざ整数にFloat使おうと思ったの? 意味とかじゃなくて、興味を持ったことに興味がある
>>245 ミリ秒以下を知りたかったからです。
Time.now.to_f を実行して、整数部分が秒数、小数部分がミリ秒で、
その精度が最大でどのくらいだろうと思っただけです。
>>246 そういう用途なら Time#nsec じゃないか?1.9,2 じゃないと使えないけど
> IEEE 754 浮動小数点数で表現できる精度が違うため、Time#to_fの最小の桁とnsecの最小の桁は
> 異なります。nsecで表される値の方が正確です。
max_score = Math.sqrt(subjects.max_by(&:score).score) min_score = Math.sqrt(subjects.min_by(&:score).score) これをDRYにするには、どうしたらいいの?
>>248 min_score, max_score = subjects.map(&:score).minmax.map{|e| Math.sqrt e}
端末にputsやpなどでひょうじさせている時は文字化けを起こしてないんですけど、 ファイルに書き込んだら\u3084\u3063\u3071\u30aa\u30e9\u30f3\u30c0\u304b\u3041などになってしまいます。 (末尾のinspectは確認して納得しています) になってしまいます。ruby 1.8.7 p249 で起こります。 1.9では起きません。 これは素直に1.9で実行した方がいいでしょうか?
なんだっけ文字参照にするxmlライブラリあったような、builderだっけ
悪い。。。本スレと間違えた
wikiがPHPとかなめてんの?
256 :
250 :2010/06/15(火) 20:38:42
#!/usr/bin/ruby -Ku str = '\u3084\u3063\u3071\u30aa\u30e9\u30f3\u30c0\u304b\u3041' str.gsub!(/\\u([0-9a-f]{4})/) { [$1.hex].pack("U") } puts str # >> やっぱオランダかぁ でいけました。 なんでこうなったかわかりませんが、とりあえず、対処はできました。
Rubyで、せめて既存フレームワークで作ればいいのにね
言語がいいか悪いかと、それで作られたものがいいか悪いかは別だろう。 Ruby製でいいものが無ければ他のものでもいいじゃない。 なめてんのとかPHPユーザーも使っちゃうようなRuby製Wiki作ってから言え。
フォームから受け取ったり、テキストデータに含まれる\n \r \r\nを削除したいのですが deleteやgsub!で変更するときに読み込んだ文章に\n \r \r\nが無いときにnilが返されますが これって ifでマッチするか確認するしかないですか?
普通にgsub!で処理したらいいんじゃないの。 str.gsub!(/\n/, '') とした場合、strの中に\nが含まれていなければ無視されるわけだし。 ifを使う必要はないのでは?
>>259 irb(main):010:0> str = "aaa"
=> "aaa"
irb(main):011:0> str.gsub!(/[\n\r]/, "")
=> nil
irb(main):012:0> str
=> "aaa"
gsub! 使ってるから当たり前だと思うけど。返り値としてデータを受け取りたいなら gsub 使えば?
>>260-261 今確認したら str=str.gsub!(/[\n\r],"")とやってました。そりゃ、無かった時にstrにnilがはいりますよね;
>>249 おお、すげ。minmaxって初めてみた。
selectとrejectをいっぺんにやるpartitionってのもあるぞ。
標準出力にshellのコマンド実行結果を垂れ流したりしつつ、 コマンドが失敗したら、例外だして中断するような処理の定石を教えてください。 例えば `ls -R` だとファイル列挙中や標準出力に時間がかかっているとその間表示されず困ります。 system "ls -R"だと逐一STDOUTに表示されるので期待通りです。 # 事前に STDOUT.sync = true してあります。 その上で、systemが失敗したときに中断したい場合、 返却値を見るようにして以下のような形にしてみましたが大丈夫なものでしょうか? system "(何かコマンド)" or raise "command error!" 手元でirbなどで試してみると動いているみたいですが。
267 :
266 :2010/06/16(水) 13:40:05
> system "(何かコマンド)" or raise "command error!" これで上手くいっていたと思ったのですが、 diffなんかで差分を出力したいというだけのときでも、 違いがある場合は返り値が1返ってきて、systemメソッドがfalse返して止まっちゃいますね・・・。 特定のコマンドでは、意図に応じて$?.exitstatusの返り値で場合わけが必要になるようですね。
そりゃそのコマンド次第としか
>>267 capistranoのrunメソッドも似たようなもんで、中断されちゃ困るときは
run "diff a b || exit 0"
とかやってる
a="aaa bbb ccc" というデータに対して手っ取り早くコメント入れる機能ってないですか? a="aaa # aaa bbb # bbb ccc # ccc " じゃもちろん文字列に含まれちゃいますがこんな感じのもので
>>270 str.lines.join ' #'
>>270 str.gsub(/$/, ' #')
>>271 はダメだったorz
lines.to_aしても改行の後ろでjoinされるんだ
a="aaa#{ # aaa }" SyntaxError: compile error /(^o^)\ これが無難になっちゃうのかな a.gsub(/ *#.*$/, "")
275 :
266 :2010/06/17(木) 14:24:57
>>269 ああ、なるほど、シェル(?)側でもそんな手があるんですね。
使ってみます
Mechanizeでつまづいているのですが <table><tr> <td><form …> <td><input …></td> </tr></form></td><tr> <td> <form><input></form> </td></table> みたいなフォームと他のタグがごちゃ混ぜになっていると WWW::Mechanize::Formの中身が空っぽになり うまくオブジェクトを生成できないんですがどうすればいいでしょうか
>>265 ほう、partition これの方が使いどころあるね。
ruby1.9.1をC:\ruby1.9.1に入れ、 ruby1.8.7をC:\ruby1.8.7に入れ、gemも導入しています。 1,8用のgemを >C:\ruby1.8.7\bin gem install hoge としてインストールしたところ、 C:\ruby1.8.7\bin gem search でも C:\ruby1.9.1\bin gem search でもhogeが出てきてしまいます。 1.8系と1.9系で分けてgemをインストールしたいのですが やり方を教えていただけないでしょうか。
>>278 そういうときはrvmつかうと楽なんじゃね?使った事ないからしらんけど
Windowsっぽいから、rvmじゃなくてpikというやつになると思う。
282 :
278 :2010/06/19(土) 10:02:33
>path=C:\ruby1.8.7\bin
>gem install hoge
>gem search
>path=C:\ruby1.9.1\bin
>gem search
で1.8.7のほうだけインストールできたような感じです。
連絡が遅くなってごめんなさい。
>>280-281 情報ありがとうございます。調べてみます。
ありがとうございました。
質問です PHPでコマンドラインから.rbを起動する そのrbの中では色々な処理をする 処理が終わったらPHPにその結果を戻す PHPでその結果を条件分岐か何かで判断してをして、Webページを作ろうとしています これって可能ですか? 上2行は確認出来たのですが、結果をPHPに戻すのは無理なような気がします どうですか? 的外れな事を質問していたらゴメンナサイ
>> "foobarbaz".include?("bar") => true >> "foobarbaz".include?(/bar/) TypeError: can't convert Regexp into String これを統一的にやってくれる便利メソッドないですか?
rakeについて質問です。 multitaskの同時実行数を制限したいです(重たい処理であるため) SizedQueueで制限して、だいたい動作しているのですが、 たまに処理が返ってこない場合があります。 ---- Rakefile ---- require 'thread' CC = "cc" OBJS = %w(test1.o test2.o) QUEUE = SizedQueue.new(2) multitask :default => OBJS rule '.o' => '.cpp' do |t| compile(t) end def compile(t) QUEUE.push(true) puts "#{CC} #{t.source}" # 動作確認用。 QUEUE.pop end ---- 何かの弾みに、どこかでデッドロックしているんだと思いますが、 ロジック的におかしいところがわかりません。 デバグも難しいというか、どうやればいいのか…。 ご示唆、ご教唆お願いいたします。
289 :
288 :2010/06/20(日) 16:16:04
初歩的っぽすぎる質問ですみません。 default_01[100620].txt default_02[100627].txt のようなファイルがある場合に、 FileTest.exist?でdefault_01だけ(カッコ以外)の部分を対象に検索かけるのはどういう表記をすればいいのでしょうか? ファイル名のカッコ以前の01部分までを変数にいれて FileTest.exist?(hensu + "*.txt") のようにしてみましたがうまく動いてくれませんでした。 質問自体わかりにくくてすみません。どなたかご教授お願いいたします。
>>290 こんな感じかな
Dir.glob("default_*[*].txt") do |file|
puts file
end
>>283 いろいろ方法ある
・Rubyでの処理結果を共通のDBに突っ込む
・Rubyでローカル用のweb API作ってphpでそちらにアクセス
>>291-292 ありがとうございます。こちらを使ってみたところ検索できました。
加えて質問になってしまうのですが、
290のような
default_01[100620].txt
default_02[100627].txt
というファイルがあった場合に、default_01を検索して、対象とするファイル名があった場合に、01をカウントアップして02として保存。
02があったら03、04という感じにしたいのですが、良い方法はないでしょうか?
考えていたのが(大雑把に)
default_xx[100701].txt というファイルがあった場合に
filename = "default_" #ファイル名は別処理で取得しているのでちょっと適当です
ext = ".txt" #ここも同様
count = sprintf("%02d", 1)
while FileTest.exist?(filename + count + "*" +ext) do #ここで*がうまく使えなかったので先程の質問をしました
count = count.to_i + 1
end
filename_new = filename.sub(/x+/, count)
File.rename(filename, filename_new)
ちぐはぐですがこんな感じのリネームをしたいと考えています。
今のところFileTest.exist?の部分以外はうまく動いているような感じなのですが、
FileTest.exist?の部分をDir::globに置き換えた場合どう表記すればいいでしょうか?
295 :
292 :2010/06/20(日) 20:07:58
>>292 を自分でレスしていいてなんだが、
Dir.glob('default_*[*].txt')
で列挙されないんだがなんでだぜ?
Dir.glob('default_*.txt')
だと列挙できた
>>294 Dir::globはヒットしない時にから配列 [] が返ってくるから、
Dir::glob(なんとか).empty? がfalseならファイルあるんじゃね?
297 :
295 :2010/06/20(日) 23:08:29
>>296 本当だ。
てことは、
Dir.glob("default*\\[*\\].txt")
でいいんだな
298 :
デフォルトの名無しさん :2010/06/21(月) 17:36:32
>295 遅くなってすみませんです。 どうにかうまくいきました。ありがとうございました。 Dir.globって便利ですね。 >296 こちらも参考になりました。ありがとうございます。 言語自体ほとんどrubyがはじめてみたいなもんですが、うまく動いたときは気持ちいいですね。
もし簡単な処理をするだけならば、TMailをラップしたActionMailerがお勧めだよ。
素直にgem入れればええやん
>>298 1.8.6ではrubygemsは動かないんだっけ?
可能ならrubygemsをインストールしてからgemとしていれるのを勧める。
直接インストールするなら、tmailのtar.gzかzipを展開すると中にsetup.rb
というのがあるので、
$ ruby setup.rb config
$ ruby setup.rb setup
$ sudo ruby setup.rb install
のようにしてインストールする。
データの永続化の方法ってどう使い分けしてます? YAMLやJSONだと配列やハッシュの構造を使い回したいとき SQLITEやMySQLは・・・? あと、JSONだとjavascriptと仲がいいとか、SQLITEだと導入が楽とか・・・。 使い分けるときの基準を教えてください
ASR p174ってどっかに無い?
305 :
デフォルトの名無しさん :2010/06/22(火) 19:50:39
matz twitter でぐぐってみた。 たしかに悪意あるかもww
日本Linux協会初代会長で、オタク嫌いだけどどう見ても自分がオタクのおごちゃんかw
木構造を扱うクラスってなんで標準で付いてないの? Array、Hashの次くらいに欲しいんだけど。
木構造って、リーフのみにデータを保持したいのか、ブランチノードにもデータを保持したいのか、とか いろいろと選択肢があって、標準と言えるような実装を作り辛い。 何か目的があるなら、たとえばdepqとか試した?
>>303 JSONはシンプルなデータ向き、可搬性が高い。
多くの場合ハッシュと配列の構造にしないとJSONで保存できない。
YAMLは複雑なデータ向き、Rubyのオブジェクトをそのまま永続化出来る。
が、そのまま保存するとそのオブジェクトの構造が変わったときに戻せなくなる。
RDBはある程度構造が決まっていて変わらない場合向け。
データ量が多くなっても安心。
MySQLの方が導入がめんどくさいけど、SQLiteより速い。
>>308 木構造クラスを標準にって話は昔からあるし、C実装レベルではNodeってのがあるけど、
RubyのAPIとしてどうあるべきかの議論が十分になされてないので。
具体的なユースケースと仕様案があるのでしたら投げてみるといいんじゃないかな。
PowerShellは識別子に!が使えるんだけど foo, foo!的使い分けって他言語でやったらアホっぽいかな
>>312 PowerShellにそういう慣習がないのなら避けるべきでは
Rubyを知らない人がそれを見たら戸惑うだろうし
Rubyは知っていてもPowerShellやCLIに詳しくない人は相互運用性の面で不安に思うだろう
!の作法はRubyだけの特徴じゃないよ。
確かにSchemeあたりも同じ意味で ! や ? を使うね 訂正するよ x Rubyを知らない人が o そういう慣習を知らない人が
>>303 >YAMLやJSONだと配列やハッシュの構造を使い回したいとき
配列やハッシュじゃなくても、Object#to_yaml や Object#to_json を使えば任意のオブジェクトをYAMLやJSONの形式に変換できます。
YAMLとJSONの使い分けですが、大雑把にいうとYAMLのほうが高機能でJSONは弱冠機能不足です(その分シンプル)。
具体的には以下を参考にしてください。
* YAMLはコメントが書けるが、JSONは書けない
* YAMLはアンカーとエイリアスを使って再帰構造が表現できるが、JSONはできない
* YAMLは時刻や日付のデータ型をサポートしているが、JSONはサポートしてない
* JSONはほぼどの言語でもまともなパーサが用意されている、YAMLは言語によってはパーサがない (これは他システムとデータ交換するときに重要)
SQLiteとの使い分けは、複雑な検索をするかどうかがポイントじゃないでしょうか。
検索条件が複雑ならSQLが使えるSQLiteのほうがいいでしょう。
そうでないなら、JSONやYAMLでいいでしょう。
# wget
http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz # tar xvzf rubygems-1.3.7.tgz
# cd rubygems-1.3.7.tgz
# ruby setup.rb
./lib/rubygems.rb:10:in `require': no such file to load -- etc (LoadError)
from ./lib/rubygems.rb:10
from setup.rb:24:in `require'
from setup.rb:24
#
こんなエラーが出てしまうのですが、なぜでしょうか?
「みなさんこんにちわ。」というのはすごくバカっぽいですね チェンジログはどこにあるんでしょうか?
最近は自動投稿ボットが動いているのか?
a=ARGV[0] b=[a].pack(゙C゙) で試したたところ、変数がpackできないのですが、 どうすればいいですか? よろしくお願いします
↑ 普通に出来ました すいません
323 :
デフォルトの名無しさん :2010/06/25(金) 12:12:37
整数型から16進数に変換する方法はありませんか? to_s(16)は見た目は16進ですが、中身は文字列なので困っています
>>323 ちょっとやりたいことが良くわからんのだけど
"ff".hex #=>255
255.to_s(16).hex #=255
整数から16進数ってのがまず何言ってるのか理解出来ない
a=0xff とすれば、0xffが手に入りますが、 プログラム中で0xffを文字列ではない型で手に入れるには、 どうしたらいいですか? どうしても文字列ではない、純粋な16進を必要としてます
>>325 内部的には 0xff も 255 も同じなわけで (0xff == 255)
a = 0xff と同じものを手に入れるには a = 255 じゃ?
>>317 etc.so という拡張ライブラリが見つからないというエラー。
通常はRubyをインストールしたときに入っているんじゃないかなあ。
こんな感じで。
$ find /usr/local/lib/ruby -name 'etc*'
/usr/local/lib/ruby/1.8/i686-darwin10.0.0/etc.bundle
>>320 1.8系なら$KCODEを設定するといいのではないでしょうか。
>>325 1と一とoneが同じ数字を表してるのと一緒で
255と0xffも表記が違うだけで同じ数字だぞ
gem で「アップデート対象のライブラリ名だけ一覧で返す」ということはできませんか update かけるとメモリ不足で1時間以上ガリガリ言って全然終わりません ライブラリだけを再インストールするとすぐ終わるのですが
もとはバイナリデータが欲しい!ってところからスタートしたんですけど ・バイナリデータはpackで実現 pack(0xA0,0XB0,"CC")で実現可能 ・どうしても16進数が欲しい ・単純な16進変換するとただのA0という文字列になってしまって、使えない ・文字列を整数型にすることができる ということがあって、どうしても16進数が欲しいんです。 byte型とかあれば別なんですが
atom api でもいじってるのか?
> '414243'.scan(/../).map {|x| x.to_i(16) }.pack('C*') => "ABC" とかいう話なんだろうか。
みなさんすいません dec = ARGV[0] #文字列を取得 dec=dec.oct #整数型に変換 mesg = [dec].pack("C") これで解決できました 16進にこだわっていましたが、今思うと何言ってんだ?って感じですよね かなり疲れていたのかもしれません・・・ ご迷惑おかけしました
octでいいんすか
>>331 $ gem outdated
actionmailer (2.3.5 < 2.3.8)
actionpack (2.3.5 < 2.3.8)
activerecord (2.3.5 < 2.3.8)
activeresource (2.3.5 < 2.3.8)
activesupport (2.3.5 < 2.3.8)
autotest (4.2.9 < 4.3.2)
cucumber (0.6.4 < 0.8.3)
json (1.2.4 < 1.4.3)
json_pure (1.2.4 < 1.4.3)
kramdown (0.6.0 < 0.9.0)
net-ssh (2.0.21 < 2.0.23)
passenger (2.2.11 < 2.2.15)
rack (1.1.0 < 1.2.1)
rubigen (1.5.4 < 1.5.5)
treetop (1.4.5 < 1.4.8)
おおおお
…というかこれとても速いというかやたら快適なんだけどどこ見てるのかな
あのバカでかい YAML を展開しないところがとても素敵
リファレンスマニュアルに載ってるObject#to_str って何のためにあるの? 実際には無いみたいだけど。 # 昔はあった? ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10] Object.new.methods.include? :to_str => false ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10] Object.new.methods.include? :to_str => false
あとObject#to_sね。 これって、 foo1 = Foo.new foo2 = Foo.new(foo1.to_s) foo1 == foo2 #=> true となるようにObject#to_sとObject#==とObject#eql?とObject#hashをオーバーライドすべき? だって「オブジェクトの文字列表現」なんだから、文字列からオブジェクトに戻らないとだめじゃね?
「to_strを読むメソッドがあるよ」という予約用に残してあるんじゃなかったかな
文字列を受取ることを期待するメソッドは、文字列でないものを受取ったときに そいつが to_str を持っていればそれを使って文字列インスタンスを得る、みたいな けっこうあてにならない用途。to_a でない to_ary もあったりする。
>>339 > 「オブジェクトの文字列表現」なんだから、文字列からオブジェクトに戻らないとだめじゃね?
そんなことないんじゃねーの?
文字列で表現することと、シリアライズとはまた別かと思う
「オブジェクトの文字列表現」かつ「文字列からオブジェクトに戻る」を満たすのは
詳しく知らんけど、yaml/storeとかいろいろやり方は合ったと思う。
>>342 そんな気がしてきた。
そして、むしろ自分で定義したクラスでto_sをオーバーライドすべきじゃないんじゃね?
to_sなんて信用できんから、んなもん呼んではならないし、使っちゃいけないメソッドなんじゃね?
と思い始めてきた。
まてよ。ちがう、やっぱり戻らないとだめじゃん。 to_sはStringに変換するメソッドという解釈なら情報の欠損は許されないはず。 to_aで要素が一個無くなったけどいいよね^^とかありえないし。
「このオブジェクトを文字列で表現するとしたら○○になる」という値を返すのが to_str 「このオブジェクトを puts で画面表示する(中に入れる)としたら○○になる」という値を返すのが to_s 「このオブジェクトを p で画面表示するとしたら○○になる」という値を返すのが inspect to_s の落としどころは結構揺れてるが現状こんなもん 交換可能であることを何ら保証しない
> to_aで要素が一個無くなったけどいいよね^^ 意味があるならいいよ data = Data.parse(['AAA', 12, 5, 34, 28]) p data.to_a で [12, 5, 34, 28] が表示されても文句は出まい
>>345 なら納得する。
んじゃリファレンスマニュアルのStringの説明にある「オブジェクトの文字列表現を返します。」は間違いってことだよね。
とりあえず公式は「to_str を(結果的に)呼んでる組み込み/添付クラスのメソッド一覧」を出すべき
349 :
デフォルトの名無しさん :2010/06/27(日) 08:30:00
toメソッドでえぇやん。 to String, to Integer みたいに使える。
VB臭がするから嫌だと声があちこちから聞こえた
ここで、「べき」とか言っても世の中は1ミリも変わりませんよ?
だって世の中を変えるのはめんどくさいし。
pythonの__repr__ は、可能ならオブジェクトの再生成に使える文字列を返せ、という ことになっておるな。
>>351-352 世の中を変えるより自分を変えたほうが早い、という名言?があってだな・・・・・
というわけでまずは、
>>348 が変わるべき
>>338 > リファレンスマニュアルに載ってるObject#to_str って何のためにあるの?
Stringと同等に扱ってほしいという特殊なオブジェクトのため。
拡張ライブラリを書くんでもなければ気にするな。
Rubyの質問なのか微妙に違うような気もするんだけど、 ActiveScriptRuby付属のiconv.exeがメモ帳で作成したUnicode(UTF-16LE-BOM CRLF)を 上手く文字コード変換してくれない。cygwin 1.7のiconvだと上手く行く。 > cat utf-16-notepad.txt | iconv.exe -f UTF-16 -t UTF-8 > utf8.txt -----入力ファイル utf-16-notepad.txt ------ ??????? 332 名前:Trackback(774)[sage] 投稿日:2008/07/15(火) 19:27:11 ID:ZxarSLVU ぎょぼぼぼぼぼぼぼぼおぼっぼ ぎょぼぼぼぼぼぼぼぼおぼっぼ ぎょぼぼぼぼぼぼぼぼおぼっぼ ???? ----出力されたファイル utf8.txt------- ??????? 332 名前 ------------- > iconv.exe --version iconv (GNU libiconv 1.9) Copyright (C) 2000-2002 Free Software Foundation, Inc $ /bin/iconv --version iconv (GNU libiconv 1.13) Copyright (C) 2000-2009 Free Software Foundation, Inc. 確かに古いから窓から投げ捨てろ!ってことなのかもしれないけど、 原因は何でなんでしょうか?あとiconv.exe消しちゃっても大丈夫なものでしょうか? iconv.dll消さなけりゃRubyに影響ないもんですかね?
現在配布されている ActiveScriptRuby 1.8.7(p299) を確認しましたところ、 bin\iconv.exeは付属されていませんでした。(iconv.dllはありました) いつrubyのbin\に入れたんだろ、これ… とりあえず、iconv.exeは消してcygwin版使います。 微妙にスレ違い失礼いたしました。 ありがとうございました。
359 :
デフォルトの名無しさん :2010/06/27(日) 21:33:18
失礼、どちらかというと「FAQに対する質問」になってしまいますが・・・。
PHPやJavaでそれなりにプログラミングの経験はあるのですが、そういう場合で「Rubyを始めるにあたっての『お作法』を知りたい」という場合、
>>2 の「初めてのRuby」をまずは一読、ということでよろしいでしょうか?
あとはリファレンスですが・・・
>>3 のWindows用HELPを落とせばいいのかな?
書籍の形になっているものは、どれもかなり古いモノのようですしね。
※「お作法」と書いたのは「Rubyっぽい書き方ってナニ?」に触りくらいは踏み込んだもの、というニュアンスで書きました。
言語仕様だけ守ってたって、いくらでも行儀の悪い書き方は出来てしまいますからね・・・
別にそれでいいよ どうしたってPHPやJavaみたいな書き方にはなるし
word_list=["foo","bar","buz"] File::open("dat.json") do |f| line =JSON.load(f) list.each do |word| puts "#{word}\n" line.each_pair do |k,v|#k:name,v[0]:回数,v[1]:内容 if v[0] >50 if v[1] =~ /#{word}/u puts "#{word}:#{k}\n" end end end end end というプログラムを走らせたときに foo bar buz buz:k_buz1 buz:k_buz2 buz:k_buz3 となってしまいます foo foo:k_foo bar bar:k_bar buz buz:k_buz となって欲しいのですが どこがおかしいのかわかりませんjsonファイルは1行で作られて100M近くです list.eachでは list配列の中を一個ずつ処理しているのではないのですか?
なにこの「then 不要派よざま見ろ読み解き難いだろう」みたいなスクリプト word_list=["foo","bar","buz"] line = File::open("dat.json"){|f| JSON.load(f)} word_list.each do |word| puts "#{word}" line.each_pair do |k,v| puts "#{word}:#{k}" if (v[0] > 50 && v[1] =~ /#{word}/u) end end こんなんでいっすか ・ JSON 由来のデータに foo を含んでる内容がそもそもない、または foo の回数が 50 以下 ・ JSON 由来のデータに bar を含んでる内容がそもそもない、または bar の回数が 50 以下 ・ JSON 由来のデータに baz を含んでる内容がたくさんあって、しかも回数が 50 以上 なのだろう データが意図どおりではないんじゃないの
363 :
361 :2010/06/28(月) 13:46:50
>>362 すいません。 then 不要派うんたらは思ってもいませんでした。
そもそもJSONのデータでv[1]でFOO BAR を大文字で書いていました。
文字列が一致するところで大文字小文字キニシナイにしたらうまく行きました。
364 :
デフォルトの名無しさん :2010/06/28(月) 22:55:58
win32-dir でできませんかね
>>364 参照先のやつとたいして変わらないかもしれないけど
require 'win32ole'
fso = WIN32OLE.new('Scripting.FileSystemObject')
drive = fso.GetDrive(fso.GetDriveName('c:\\'))
p drive.VolumeName
367 :
デフォルトの名無しさん :2010/06/29(火) 00:54:51
>>366 おおっ。素晴らしい。
とてもエレガントなコードですね。
ありがとうございました。
368 :
デフォルトの名無しさん :2010/06/29(火) 13:15:04
class Guitar < AX end class ElectricGuitar < Guitar end ElectricGuitarのインスタンスに対しては ↓のようにis_a?を使ってAXを継承しているか判定できますが g = ElectricGuitar.new g.is_a?(AX) ElectricGuitarクラスがAXを継承しているかどうか判定するメソッドはありますか?
p ElectricGuitar < AX
あ、厳密には継承以外の関係があっても true を返すので注意 irb> module M; end irb> class C; end irb> p C < M nil irb> class C; include M; end irb> p C < M true 定数だけで判別することはできないんじゃないかなあ
ありがとうございました
>>370 Classなら継承、Moduleならmix-in。
373 :
デフォルトの名無しさん :2010/06/30(水) 15:03:11
warning: already initialized constant HOGE という警告が出るのですが、どこで二重に定義されているのか 探してもイマイチわかりません。 何かいい方法はありませんか?
-w オプション $ cat a.rb class C HOGE="once" end require 'b' $ cat b.rb class C HOGE="twice" end $ ruby -w a.rb ./b.rb:2: warning: already initialized constant HOGE
例えばRubyで何かのサーバ的なものを作って、 そこで動的にClassを定義し続けるとどうなりますか? インスタンスはGCされると思いますが、Classの定義はどうなっちゃうのでしょうか。
クラスは結局定数だから平気なんじゃ
実用上問題ないかもしれないが無限という訳ではなかろう
>>375 hoge = Class.new ... のようにして作るってことだよね。
参照がなくなればGC対象になるよ。
>>378 instance_eval("class Hoge32; def initialize ...") とかやるってことじゃね
つまりクラスはremove_constで消せると。 # クラス定義 class Foo end # インスタンス生成 foo1 = Foo.new # クラス定義を削除 Object.class_eval do remove_const :Foo end # たしかに削除されてる Foo NameError: uninitialized constant Foo from (irb):31 from :0 # でもインスタンスからクラスを取得してそっからインスタンス生成できる foo2 = foo1.class.allocate =>#<Foo:0x10034cc08> むー…これってセキュリティ的にどうなんですかね…
定数に代入した場合も、remove_constは出来るから参照をなくすことは可能かと。
文字列を組み立ててevalしなくても、 hoge = Class.new(Super) do |klass| def ... end みたいにできる。
>>380 削除したのはクラス定義(Classオブジェクト)ではなくクラス定義を参照している定数だけ。
インスタンスから参照されている以上、Classオブジェクトは無名のままのこっている。
インスタンスが全部GCされればその参照もなくなる。
>>380 セキュリティに関わるからという理由でクラス定義を削除する元々の発想が駄目
Win32APIクラス(ライブラリ?)の使い方が良くわかるサイトや書籍、無いですか? C言語で書かれたDLLを使いたいんですが引数の指定方法とかがわからないんです。 MyLIB.DLL にある int setData(int cmdCode,char* dataArea); char* getData(int cmdCode); という関数を呼びたいんですがRubyでどう書いたらよいかわかりません。 わからないのが、引数の並びを指定する方法です。 obj = Win32API.new('MyDLL','setData','IP','I') なのかそれとも obj = Win32API.new('MyDLL','setData','i p','i') なのか、あるいはもっと別の指定があるのか、 それともRubyの処理系に依存するんでしょうか?
388 :
デフォルトの名無しさん :2010/07/02(金) 01:36:21
class C def f; end end class C2 < C def f respond_to? :super end end p C2.new.f #=> false C2#f の中から super が呼べるのに、どうして false になるんでしょう?
super は C2 のパブリックメソッドじゃないから irb> class E; def e; respond_to?(:eval); end; end irb> p E.new.e false これと同じ理屈
390 :
388 :2010/07/02(金) 10:34:39
>>389 そうですか。なら super が呼べるかどうかはどうやって調べたらいいんでしょうか
次のように書いてみたんですが、何か違うような気がしてます
class C
def f; "C#f" end
end
class C2 < C
def f
if self.class.ancestors.drop(1).find{|klass|klass.instance_methods.include?(__method__.to_s)}
super
end
end
end
p C2.new.f #=> "C#f"
superってメソッドだったっけ?予約語のような気がする。
>>390 super したときに NoMethodError: super: no superclass method を rescue
スーパークラスの詳細知らずに super するというそもそもがなんか間違ってる気もする
defined? を使えばいいんじゃ? Ruby の魔境のひとつだがw
395 :
388 :2010/07/02(金) 16:53:16
>>393 確かにそうですね。superは明示的に書くものであって、動的に判断するものじゃないと思ってます。
ただちょっと例外的に、他のモジュールのことをまったく知らない、いくつものフック的なモジュールを、
ほとんど順番を考慮せず、一つのクラスにたくさん include するようなことをやろうとしてます
>>394 defined? で判別できました。ありがとうございます
まさかこれで super が判別できるとは思いませんでした
396 :
デフォルトの名無しさん :2010/07/03(土) 16:38:31
Rubyの入門書読み終えて何か作りたいと思ってるんだけどお勧めの本ある?
お勧めの本は探せばあると思うよ
>>396 特にない
何かを作りたいと思えるまで放っておくのがいいぞ
ギムでプログラミングするなんて全く楽しくない
HTMLで出力してWebブラウザで見れば結果の見栄えは結構なんとかなるんで、 自動化できそうなことがないかなーとか思いながら日々を過ごしてみるといいぞ
何か作りたいならまず作りたいものを考えるのが普通だと思うが 必要な本なんて作るモノ次第で全然変わってくるんだし
Rubyの入門書を終えただけだと 実際に何が作れるのかよくわからないっていうのはある そういう人に向けて書かれた(であろう) Rubyアプリケーションプログラミングって本があるけど古いんだよね
Linuxのroot権限を持ってないのでgem install hogeができません。 hogeはgemだけで公開されているみたいなんですが、hogeを一般ユーザーが使うにはどうしたらいいでしょうか?
gemコマンド自体は入っている場合、 方法1: →sudoせずに.gem以下にインストールし、PATHを通す。 なお、sudo 付きでgemコマンドを実行することにはセキュリティリスクが伴うことが 指摘されている。 gemコマンドが入っていない場合、 方法2: rubygemsライブラリをホームにインストールしてから↑と同じようにやる。 方法3: gemファイルは単なる無圧縮tarアーカイブなので tar で展開する 出てきた data.tar.gz (gzip圧縮) を再びtarで展開する。 lib以下を個人のrubyライブラリ置き場($HOME/lib/ruby とか)へ、 bin以下のファイルを個人用のPATHを通した場所($HOME/binとか)へ。
おっと忘れてた。 方法4: rvm を使って $HOME/.rvm の中に自分用Rubyをインストール。 その後自分の権限で gem を使用する。
トン 家宝にします。
特に創りたいものがないなら、何かのクローンを作るのがいいかな。 2chのスレ取得と書き込みなんかも結構いいかも
>>407 クローンはいいけど2ch系のは勘弁してほしい
この前までRailsスレが自動投稿で荒らされてたんだから
そんなこと言ってたら作れるもんも作れないわ
>>396-398 むしろやりたいことないのになんでプログラムやってんのw
やりたいことを先に定義したほうがいいと思うけどな
そうしないと技術ばかり学んでしまって、
最初は新しいことばかりで学習意欲あるならいいけど、
壁にぶつかったときにモチベーションなくなっていやになるぞ。
それよりも、やりたいことあるならなるべく必要最低限のことをやって
直行すればいいと思う。
わざわざ回り道をしているとモチベが・・・ってやりたいことないから回り道もクソもないけどw
>>408 何故か質問内容から推測してリンク書き込まれてたなw 古いページのリンク勘弁w
Rubyで末尾再帰は最適化されないので func(x) unless x==0 puts x func(x-1) end end こんな感じの条件が来るまで同じ関数を呼びたい場合は whileループを使うしか方法がないのでしょうか もっとスマートな方法がないのでしょうか
冗談きついわ
scheme使ってください。
>>410 >むしろやりたいことないのになんでプログラムやってんのw
楽しいからでしょ
すみません、質問です。 1.8.7でid3lib-rubyというライブラリを使おうとして、 gemでインストールも済まして、1.8.6で作ったプログラムを走らせてみたところ、 なぜか no such file to load -- id3lib (LoadError) というエラーが出てしまいます。 未対応とかそういう感じでしょうか? ちなみに1.8.7は上に書かれているActiveScriptRuby 1.8.7をいれています。 どなたかご教授お願いします。
ruby 1.8 だと gem で入れたライブラリを使う時は、それを require する前に、 require "rubygems" が要るんだけどそれは大丈夫?
>>416 ありがとうございます。まさにそれでした。
バージョン違うとこういうこともあるんですね。うーん、たいへんだー…
バージョン全く関係ない 環境変数 RUBYOPT に -rubygems が設定されてるかどうかだけ 実際問題として廃れたので忘れていいし、二重に require しても実害はないので毎回 require 書くほう推奨
ruby 1.9 だと何もしなくても最初から rubygems を require したのと同じ状態になってるから
421 :
デフォルトの名無しさん :2010/07/05(月) 23:20:04
hash1 = {a=>b} hash2 = {c=>d} これを結合したいんですが配列みたいに簡単ではないんですか? hash2.each{|key, val| hash1[key].push(val) } これが一番簡単なんでしょうか?
hash1.merge(hash2)
423 :
421 :2010/07/06(火) 01:02:00
ありがとうございますできました 追加で質問なんですが hash1 = {test=>1} hash2 = {test=>2} これを結合して{test=>1,test=>2}としてeachで処理したいのですがその様な メソッドはありますか?keyが重複するので無理な気がしますが あと上記のmergeメソッドはkeyが同じだと()の方のvalueに上書きされるようですが hash1にhash2のvalue値を加算するメソッドはないでしょうか?
system "shutdown -s -t 0" は可能なのに、 `shutdown -s -t 0` が不可能なのはなぜでしょうか? Windowsです。
>>423 同じハッシュの中で重複するキーは存在できない。
hash1.to_a + hash2.to_a で [[test, 1], [test, 2]] という形になるので
これをeachでまわせばいいのではないだろうか。
逆にするには立場を変えて hash2.merge(hash1) とするか、
もしくは、ActiveSupport(=Rails)のHash#reverse_mergeなど。
あー、最後まで読んでなかった。 同じキーの値を集約するような仕組みはないよ。
>>423 こういう処理ですかね。
hash2.each do |key, value|
if hash1.has_key?(key) then hash1[key] += value else hash1[key] = value end
hash1の各値が + に答えられるかどうかは定かではないから標準的に組み込むほどではないかなぁ。
Ruby の immutable なクラスのオブジェクトはオブジェクト ID が一意だから irb> p "10".object_id -609838208 irb> p "10".object_id -609849388 irb> p 10.object_id 21 irb> p 10.object_id 整数10に対応するオブジェクトIDはインタプリタごとに一定(たいてい21)
>>427 じゃあオペレータを外にだして、
class Hash
def self.matz(*others, &op)
end
end
Hash.matz(hash1, hash2){ |a, b| a + b}
な感じは。
>>429 すまん、何が問題なのか解らん。
ただ単にdupした「ふり」をすればいいだけなのでは?と思うんだけど。
Objectクラスに定義されているもんを禁止までする意図が解らないんです。
全てのクラスの親クラスであるObjectクラスが持っているメソッドは、全てのクラスで使用可能=ポリモーフィズムできる、勝手にと期待してるんですが…。
これのせいで「シンボルか数値の場合はdupしない」とかいう条件分岐が増えてポリもーフィズムを阻害してない?
dup してもオブジェクトIDは同一なままというほうがキモい お前 dup を実行させておいてそんな動作で恥ずかしくないのかみたいな エラーが出て動作が禁止されるほうがマシ
(´・ω・`)っ class Symbol; def dup; self; end; end (´・ω・`)っ class Numeric; def dup; self; end; end
>>432 逆に考えるんだ。
object_idが見えること自体がキモい、そう考えるんだ。
>>432 非推奨で「使うのマジやめろ」というのなら、例外はいて欲しい牙する
どういう致命的な問題がおきるか?をだしたほうがいいんじゃないのかな? これやばい、バグじゃね!?って思わせればヤバさがわかるだろう > 10.dup.object_id TypeError: can't dup Fixnum お?
ごめん、ちゃんとエラーでてたのか リンク先も読んでないのバレバレだなw その上でなんでだよ!と言っているのか
そもそもオブジェクトの複製やクローンとはなんぞやという話になるな
理想郷を現実に具現化する際には何かしらの妥協がだな… …おっと誰かが来たようだ。
dupするのは一方のオブジェクトを書き換えたいから (一方のオブジェクトを書き換えても、もう一方のオブジェクトはそのままにしたいから) なので大抵dup後には一方のオブジェクトを書き換えるコードが続く そこでもしdupしたオブジェクトがimmutableだったら以下略
immutableの意味を辞書で調べてからもっぺんかかってこいやーみたいな感じではある
かかってこられても困る ほかでやってくれ
apiからjson形式でファイルをGETしているのですが、 要素のアクセスはどうやってやるのでしょうか?
なんだかよくわからんが gem で json ライブラリインストールして マニュアルなり解説なり見ればいんでは
446 :
デフォルトの名無しさん :2010/07/06(火) 18:25:17
{a=>5, b=>3, c=>0, d=>0, e=>4} このハッシュのvalが0の要奴を全て消して {a=>5, b=>3, e=>4} にしたいのですがどう書けばいいでしょうか?
{a=>5, b=>3, c=>0, d=>0, e=>4}.delete_if{|k, v| v == 0 }
449 :
デフォルトの名無しさん :2010/07/06(火) 18:54:23
c言語で質問です。 課題でファイルを読み込んで上位5名をcsvファイルに書き込むというのがありました。 ファイルは確か1500人の名前と偏差値がありました。 そこでflagとかfirstとか使っていてさっぱりだったのですが。 後々flagについて調べましたがわかりません。
あ?
451 :
デフォルトの名無しさん :2010/07/06(火) 19:33:46
ちょww 板違いにも程があるぞwwww
板じゃなくてスレ
453 :
デフォルトの名無しさん :2010/07/06(火) 20:51:48
間違えちゃった☆
454 :
デフォルトの名無しさん :2010/07/06(火) 21:05:08
えへっ
>>423 >hash1にhash2のvalue値を加算するメソッドはないでしょうか?
mergeをブロック付きにすればそんなこともできる
>>457 h1 = {:a=>1, :b=>2}
h2 = {:a=>3, :b=>4, :c=>5}
h3 = h1.merge(h2){|key, self_val, other_val|
self_val + other_val
}
p h1 #=> {:a=>1, :b=>2}
p h2 #=> {:a=>3, :b=>4, :c=>5}
p h3 #=> {:a=>4, :b=>6, :c=>5}
459 :
デフォルトの名無しさん :2010/07/08(木) 14:24:45
昨日テンプレにあるActiveScriptRuby 1.8.7をインストールしましたが、DOSプロンプトが開くだけのものですか? プログラムを作るソフトウェアって聞いたのですが
>>459 あれは普通のプロンプトに環境変数の設定を加えたもの
具体的にはRubyバイナリへのPATHが設定されていたりする
環境変数やPATHってなーにとか、どうやってプログラム作るのとかは
自分で解説サイト探すか『たのしいRuby』でも買って読んで
>>460 意味わかんない…本売ってない…サイト見つからない…
釣られてるww
Ruby関係のイベントが網羅されてるサイトはないの? イベントの種類別、地方別、対象者別とか、Rubyの本が出版されたとか、雑誌に特集が組まれたとか、 自分にマッチしたイベントをRSSで受信したりとか、そういうの。
ま、なかったら漏れが作るけど、俺がほしいから。
>>465 作ったらここでアナウンスしてね。楽しみにしてるよ。
るびまがはどうなんかね?
ぶっちゃけ、そもそもの元情報が少なくてまとめるのを憚られるレベルだと思う
書いておいてなんだけど、小さなイベントもあるから各自フィルタリング必要だね
API見ると、除外キーワード指定みたいな融通は聞かないし、
メタデータ見たいならatomじゃなくてxmlから取得したほうがいいし、
フィルタするならYahoo Pipesなど通してくれということで
ATND API リファレンス
http://api.atnd.org/
1278821866のようなunixtimeを yyyy年mm月dd日 hh時ii分 のように変換したいのですが、年、月、日、時、分ごとに数字を取得したいです。 yyyy,mm,dd, hh,iiの部分です。 どうするべきでしょうか?
Time.at(1278821866)
結構、言語処理系に行くっていうのが、はまりポイントで、 確か、Rubyのまつもとゆきひろさんか誰かがおっしゃっていたんですが、 「エンジニアっていうのはだいたいOSを作るか、 言語処理系を作るかに分かれる」らしいんです。 私はどっちにも足をつっこんでしまった感じで、 これは泥沼なんじゃないのかなとも思いますね(笑)
474 :
デフォルトの名無しさん :2010/07/12(月) 21:25:44
また古いネタ引っ張り出して...
Matzの頭にはCPUを作る方への分岐はないんだな
プログラマーの三大罠だっけ? ・プログラミング言語を作る ・OSを作る ・CPUを作る どこが出展だったか
ミイラ取りがミイラになる感じですね
プログラマはだいたいこの辺のどっかに分類できる。 分布がばらけるように人選するとまぁまぁ色々と上手くいく。 マクロ ↑ 具体的←┼→抽象的 ↓ マイクロ
マクロとマイクロってなんだよ マクロなら対になる言葉はミクロだろ 使い慣れない言葉を使っても全く説得力がない
カタカナでどう読むかを必死になって訂正するやつってなんなの?
たとえ語源がどうでも、定着すればこのときはこう使うという社会の同意がある。 おまえは人と交わらないからわからないのかもしれんけどな。
なにこのフィッシャーマンズワーフ つまんないことでいちゃもんつけてる人は社会から隔離されてくれ
釣りをしてるやつってことか?わかりづらいな
MatzがELIS復活に来るぞ。
で、Ruby(俗にいうRuby1.8.6)とMatz ruby(俗にいうRuby1.9.x)はどちらが 主流になりそうですか。
なんか色々間違ってるが、1.8.7 を 1.8.6 非コンパチ機能使い倒しで利用するのが今年のベストかと 1.9.2 が出ればエンコーディング関連の使いやすい方法も発明されるに違いない たぶん
>>485 1.8も1.9もMatz Ruby(MRI)だぞ。
MRI と YARV 、と対比した場合は 1.8 が MRI
GAEでRubyは使えますか?
JRubyなら
1.8系列で実用的な互換性が維持されていて、早いのはどれでしょうか。 YARV 1.8 版はでませんか
早いのは1.8.7じゃないかな 速いのは1.9.1か?
互換性って何との互換性? Ruby1.8.5とそれ以前は今で言う開発版だから互換性なんて考慮されてないよ それに2006年のリリースものなんて捨ててくれ頼む
なんで?まだ5年も経ってないんだからサポートするのは当然
開発版なんだからサポートしないのは当然
> YARV 1.8 版はでませんか でません
じゃ、LLVM版の1.8.6は出ないでしょうか
LLVMはコンパイラじゃないか?
コンパイラというよりフレームワーク MacRubyが採用しているらしいが、 そもそもMacRubyは1.9互換を目指してるわけで……
String#inspect が化けるようなのですが、最新版では直っていたりしますか? # 1.8.5, 1.8.6 や 1.8.7 p160 などで試したら化けませんでした。 % ruby -v -Ke -e 'p "ほげ"' ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-freebsd8] "ほ\244\262"
500 :
デフォルトの名無しさん :2010/07/16(金) 10:02:32
method(@command).call
と
send(@command)
って何が違うんですか?
Ruby逆引きレシピ
http://www.amazon.co.jp/dp/4798119881 の Plugable Selector パターンの例で method(...).call が使われてたけど
send(@command) ではダメな理由が書かれてなかったので疑問に思いました。
501 :
499 :2010/07/16(金) 10:44:04
聞くより試した方が早いですね。 1.8.7 p299 では直っているようでした。お騒がせしました。 % /usr/local/ruby_1_8_7/bin/ruby -v -Ke -e 'p "ほげ"' ruby 1.8.7 (2010-06-23 patchlevel 299) [i386-freebsd8.0] "ほげ"
>>499 1.8.7シリーズで化けていたが最新安定版では直ってる
>>500 コマンドってゆーな
オブジェクト指向言語なのでメソッド名かメッセージと言ってくれ
Object#method(mes) は可搬性のある Method オブジェクトを生成し、call したタイミングで「実行」する
Object#send(mes) は単に mes というメソッドをその場で「実行」する
503 :
499 :2010/07/16(金) 10:49:44
>>502 どもです。了解です。
そういえば RUBY_PLATFORM の形式が、
"i386-freebsd8" → "i386-freebsd8.0" と変わってるんですね。
patchlevel が上がるだけでこうコロコロ変えられちゃうのはなんだかなあ。
504 :
500 :2010/07/16(金) 10:55:46
>>502 その本の例が @command だったんですよw
また可搬性のある Method オブジェクトを生成したあと、
持ち運ぶことなく、すぐに call してただけなので
それなら send でいいってことになりますね
>>503 配布するconfigureの生成に使っているautotoolsが変わったのかもね。
drubyって使ってる人いんの? うごくよ!うごくね!以上。FIN. って感じでは。
>>506 いるよ
いるんだけど、分散環境に造詣のある人が自己流で使い倒してるので、外部の人にノウハウがたまらない印象
まあよくある感じだな
cgi.rbもノウハウたまらなかったんだな
510 :
499 :2010/07/16(金) 14:09:12
>>505 あ、 autotools の側の問題ですか。
"i386-freebsd8" は FreeBSD ports で入れたので配布物と同じものだと思いますが、
"i386-freebsd8.0" の方はリポジトリを取ってきて自分で autoreconf したものです。
なので、うちの環境の方の問題である可能性がありそうです。
あらぬ嫌疑をかけたかもしれません。
>>503 はひとまず前言撤回します。すみません。
>>510 portsだとFreeBSD 8.xでバイナリ互換性があると知っているので .x の部分を落としてるけど、
autoconf を直接使うとそんなことは知らないので .0 とか .1 がつくんじゃないかな。
なお、ports とか pkgsrc とか apt とかは Ruby のコアチームとは別なのと(兼ねている人もいるけど)、
OSごとの事情があるので、個別のパッケージシステムでの Ruby と素の tarball は
いろいろ違ったりすることもある。
たぶん --target=i386-freebsd8 を指定してるんだろう。 FreeBSDは知らんが、MacPortsでもtargetを指定してminorを削っている。
島根って聖地?
発祥の地はトヨタケーラムじゃないの?
515 :
デフォルトの名無しさん :2010/07/17(土) 01:48:03
ファイルの入出力で f = open("file","+a") とやって一度に読み書きしようとすると上手く動かない時があります。 入力専用と出力専用でそれぞれ開いて閉じてってやるとちゃんと動作します。 なんでですかね?
cのように参照渡しで関数に値を渡して、直接に値を変更するにはどうしたらいいのでしょうか?
cに参照渡しはない PASCALとかC++にならあるけど
ああ、C++でした。 rubyにはないのでしょうか?
rubyは本質的には全部参照渡し
本質的とかよくわかんないけど参照渡しでない例 a = 0 def foo(x); x = 1; end foo(a) a MatzまでRubyは参照渡しとかいってたらRubyやめる
Rubyをfjで発表した頃はトヨタケーラムだけど、Ruby誕生の頃は浜松にいた。 ていうか、言語屋でrubyを参照渡しとか言う奴はいないだろ。Cと同じで全て値渡し。 Call by sharingとか呼ぶ向きもあるけど。
>>516 怒られそうな書き方だが、超大雑把には OPEN と READ と WRITE と FLUSH と CLOSE の5種類の概念がありまして
OPEN は関連したストリームを開く
READ は所属ストリームから読み出す
WRITE は所属ストリームの書き込みバッファに複製
FLUSH は書き込みバッファにあるバイトを強制的に書き込む
CLOSE は所属するストリームを閉じてリソースを手放す
Ruby の write メソッドは WRITE だけを行い、FLUSH は通常行わない(効率の問題)
FLUSH で確実に書き込みが行われるのは close メソッドで IO オブジェクトが閉じられるとき
write メソッド(を呼んでる puts や print)を使用した時点では、ディスクに変更は恐らく反映されていない
変更されていないファイルを再度開いて何かしてもおそらく意図通りには動作しないだろう
通常、Ruby の IO オブジェクトや File オブジェクトは、
ブロックつきメソッドを併用して read や write の瞬間だけ開けて即閉じる
IO オブジェクトを生成したまま他のことを行うということはまず無い
>>521 意味が解らないんですけど…
それのコードは参照渡しの例に見えますが…
x もし、Rubyが参照渡しができるなら、local_unkoは"FUCK!!!"になってるはず o もし、Rubyが参照渡しができて、引数のデフォルトが参照渡しか、もしくは明示的に参照渡しを指定したならlocal_unkoは"FUCK!!!"になってるはず
他の言語で参照渡しが必要だった場面を思い出したけど、 組み込み型に影響を与えたい場合(変数がnullじゃないなら開放して変数にnull入れるような関数とか。返却値でnull代入だるい) 関数やメソッドで多値を返せない言語で多値を返す場合とか(複雑な場合は構造体か簡易なオブジェクトを返すようにしてたけど) とかだったな。 Rubyだと特に困らんから気にならなかった
変数に保持してるのがオブジェクトへの参照ということと、 参照渡しという概念がごちゃまぜになってると予想
え、Rubyって値渡しって言われてるの? 参照渡しとは違うのはわかるが値渡しでもないような。 irb(main):001:0> local = "local" => "local" irb(main):002:0> def func(arg);arg.replace "arg";end => nil irb(main):003:0> func(local);puts local arg => nil 単純に値渡しなら、localはlocalのままのはず
>>529 せっかく
>>525 がwikipediaのリンク先を示してくれたのに、 コードと書き込みだけ読んでまったくスルーした発言ワロタw
ただのFAQに何をグダグダやってんだか…
>>517 基本的に無理。抜け道はないでもないけど字面的に無様すぎる。
$a = "a"
$b = "b"
def replaceit(x, y)
eval "x=$b", y
end
c = $a
puts c # ==> "a"
replaceit(:c, binding)
puts c # ==> "b"
リンク先を読んでないの笑うのいいけど、どうせ読まないんだしコピペぐらいしてやればいいと思うんだ
> 参照の値渡し [編集]
>
> 参照渡しで言うところの「参照」と呼ばれているものと、特定の言語で「参照」と呼ばれているものが
> 必ずしも同じでない事には注意が必要。
> 例えば、Javaは参照型を扱うための『Javaの「参照」』を持つが、これはPascal等のポインタ相当で、
> 『参照渡しの「参照」』とは概念が違うため、『Javaの「参照」』を渡しても参照渡しであるとは言えない。
> C言語の「ポインタの値渡し」と同じである。JavaHouse-Brewers の議論を参照
http://java-house.jp/ml/archive/j-h-b/026214.html#body > これは、Javaの参照型と似た参照型と、Javaのプリミティブ型に近い値型を持つC#を見ると理解しやすいだろう。
> C#では、特に指定しなければ参照型も値型も値渡しされるが、
> 引数に ref もしくは out を使用する事によって参照渡しにする事ができる。
> 『C#の値型』を渡すから値渡し、『C#の参照型』を渡すから参照渡しとはならない。
まあ値渡しと参照渡しのメルクマールは
>>521 だな
java-houseの議論は今ではよく名の知られた人が
泥沼の議論を展開していて一見の価値があるぞ
>>521 の例だと関数への渡し方うんぬんもあるが
代入の考え方の違いも気になる部分だと思うんだが
関数とか言っちゃった
入門書の間違いなんて、たまたまそれに嵌って痛い目にあったりでもしない限り、 いちいち覚えちゃねえよ。 複数言語やってりゃ、記述が間違っていても何となく回避してるし。 子どもの時に乗った三輪車の善し悪しなんぞ誰もわからんのと同じ。 ぐだぐだ言うのは、三輪車をとっかえひっかえしている池沼と、書いた著者くらいのもん。
どのレスに対するレスなのかさっぱりわからん
ヒント: 誤爆
ではなく書籍推薦スレのおかしなレスのコピペ
line = '
http://www.amazon.co.jp/ http://www.2ch.net/ http://www.google.com '
のようになっているときに、lineのurl各々に正規表現でマッチさせるにはどうしたらいいでしょうか?
if /^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/u =~ line then
tmp = line.scan(/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/u)
とすると、この場合amazonだけにマッチして、2chやgoogleはマッチしません。
URI.extract(line)
>>540 >>541 だな
これはよくあるトラップ
URIを正規表現で書こうとする
↓
わからない・・・
↓
URIにマッチする正規表現をググる
↓
間違えているのをコピペする
↓
手元では動くが、納品してから失敗する可能性が発覚
URIの所をeメールアドレスに変えるとケータイのメールアドレスみたいになる
ついでに
>>540 の例だけ見てると、splitでええやんという気がしてくる。
実際の問題の複雑さと質問例の乖離ってことね。
次にお前は、「http以外も抽出されて困っています」という
第2引数あるじゃん
質問です。 ちょっとしたスクリプトの挙動を調べたい時に どのメソッドが順によばれたのか?というようなログを自動で出力してくれるライブラリはないでしょうか?
require 'webrick' しただけで real 0m32.089s user 0m0.054s sys 0m0.022s とかかかるんですけど、こんなもんなんですかね? $ ruby -v ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10]
質問です! Rubyでゲーム作れるって聞いたので
ttp://jp.rubyist.net/magazine/?0018-GameProgramingForRubySDLのサイトのリンク先でsource of Ruby/SDL 1.3.0というのが見つからなかったのでrubysdl-win32-binの1.3.0をダウンロードしてprogrum file内にインストールしたRuby1.8の下にフォルダを作って解凍しました。
回答したあとinstall_rubysdl.rbを実行したら変なメッセージが出たのですが無視してテストのウィンドウだけ出すプログラムを作ってみたらファイル名:2:in `requie' : no such file to load -- sdl (LoadError)というものが出ました。
どうしたらウインドウを出す様に出来るのでしょうか。ちなみに変なメッセージはこんな感じでした。
mkdir -p C:/Program Files/ruby-1.8/bin
mkdir -p C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8
mkdir -p C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/i386-msvcrt
install -c dll/jpeg.dll C:/Program Files/ruby-1.8/bin
C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/fileutils.rb:1264:in `initialize': Permission denied - C:/Program Files/ruby-1.8/bin/jpeg.dll (Errno::EACCES)
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1264:in `open'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1264:in `copy_file'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1263:in `open'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1264:in `copy_file'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:464:in `copy_file'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:845:in `insrall'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1397:in `fu_each_src_dest'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1411:in `fu_each_src_dest0'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:1395:in `fu_each_src_dest'
from C:/Program Files/ruby-1.8/lib/ruby/1.8/fileutils.rb:841:in `insrall'
from C:/Program Files/ruby-1.8/rubysdl-1.3.0-mswin32-1.8.5-p12/install_rubysdl.rb:26
553 :
つづき :2010/07/17(土) 20:20:46
from C:/Program Files/ruby-1.8/rubysdl-1.3.0-mswin32-1.8.5-p12/install_rubysdl.rb:26:in `globe' from C:/Program Files/ruby-1.8/rubysdl-1.3.0-mswin32-1.8.5-p12/install_rubysdl.rb:26 以上です。宜しくお願いします。
install_rubysdl.rbを実行したら変なメッセージが出たのですが無視して
>>554 やたら長かったんですもん(^^;
頑張って一応書きました
C:/Program Files/ruby-1.8/bin/ にすでにjpeg.dllがあるからとかそんな気がするな。 すでにあったら、どっかに移動させとけばいいんじゃね
>>556 C:/Program Files/ruby-1.8/bin/にjpeg.dll見つかりませんでした
2010-07-17 22:03:42 +0900 のような日付を西暦や分などで分けてそれぞれ取り出したいのですが、 何かいいメソッドはありますか?
>>551 $ time ruby -rwebrick -e ""
real 0m0.608s
user 0m0.520s
sys 0m0.090s
変なとこで名前解決でもしてるのかね
>>559 require 'time'
t = Time.parse('2010-07-17 22:03:42 +0900')
[t.year, t.min] #=> [2010, 3]
>>559 require 'time'
s = "2010-07-17 22:03:42 +0900"
t = Time.parse(s)
p t.year
p t.min
puts t.strftime('%Y年%m月%d日%H時%M分%S秒')
>>560 >>551 だけど
require 'webrick'
すると
Socket#gethostbyname
が呼ばれることが解った。
そこで名前解決できてなかったと。
・こんなのWEBrick::HTTPServer#startのときで良いじゃん。
・ってかなんかメッセージくらい$stderrかロガーに吐いてよ
とか思いつつ。
>>557 じゃ C:/Program Files/ruby-1.8/bin/ の書き込み権限がないんだろ
.stripメソッドは全角スペースには無効なのでしょうか?
(1.9だと) ONIGENC_CTYPE_SPACE 属性を持っている文字を削るようになってるけど stripされないなぁ。 ’ a '.sub(/¥A[[:space:]]+/, '').sub(/[[:space:]]+¥z/, '') は出来るんだけど。
ハッシュのキーとしてシンボルを利用するメリットって何でしょうか? たのしいRubyには「単純に「同じかどうか」を比較するような場合は、文字列よりも効率がよいことが多い」 と書かれているのですが、どう効率が良いのか今ひとつピンと来ません。 私が「シンボルとは何か」を理解できていないというだけのことなのかも・・・。
Symbol#hashはObject#hash 同じ字面のシンボルは全て同じオブジェクトになるので、ハッシュ値はobject_idのみで計算できる。 String#hashでは、同じ字面であっても、オブジェクトとしては異なる場合が多々あるので、 表す文字列の内容からそれぞれ計算する必要がある。
初心者スレで話す内容かわからんけど、 シンボル相当がない他の言語やっててRuby触ってたときにシンボルの必要性がわからなかった。 Hashのキーにするにしても文字列で指定ですませる言語ばかり触ってたので。 Rails界隈を見てると、ActiveSupportでHash.symbolize_keysみたいにHashのキーをシンボルに一気に変換したり、 文字列に変換したり、あげくにシンボルでも文字列でもどっちでもいいようにするHashWithIndifferentAccessが用意されてたりするも、 結局はシンボルを使うようにする習慣みたいのがあるみたいだけど 何がいいたいかというと、シンボルにした方がいい消極的な理由はわかるんだけど、 シンボルにしないといけない理由がわからないん・・・
>>571 の日本語が変になってしまったのでまとめると、
シンボルにしなければならない理由は何なのだろう?
ということです。
機械ができるところを人間が選んで使い分けする必要性がわからないといいますか。
>>569 Cなんかでは、
#define YES 1
#define NO 0
のように単語を整数と結びつけることがよくある
Rubyのシンボルも似たようなもので、
Rubyインタプリタはシンボルが出てくるとそれを整数(など)と結びつける
これに対して文字列が出てきたら文字の並び(など)と結びつける
ハッシュのキーの比較をするにあたって
シンボル同士の比較なら整数同士の比較を一度行えば済む
これが文字列同士の比較なら一文字ずつ比較していかなきゃいけない
後者は文字列のサイズが大きければ大きいほど時間がかかる
文字列でなくシンボルで足りる場合はシンボルを使ったほうがいいのはたぶんこういう理屈
文字列の比較をするにあたって何らかの最適化が行われてるかもしれないけれど Rubyの文字列は変更可能だし 単なる整数の比較よりは時間がかかるだろうことは間違いないので許してね
>>570 回答ありがとうございます。しかし、もしよろしければ
>String#hashでは、同じ字面であっても、オブジェクトとしては異なる場合が多々あるので
という一文の例を、できれば簡単なもので挙げていただけませんかorz
576 :
569 :2010/07/18(日) 14:58:47
>>575 $ irb
irb(main):001:0> hoge={'huga'=>4,:hage=>7}
=> {:hage=>7, "huga"=>4}
irb(main):002:0> hoge.keys()
=> [:hage, "huga"]
irb(main):003:0> hoge[:hage]
=> 7
irb(main):004:0> hoge['hage']
=> nil
irb(main):005:0> hoge["huga"]
=> 4
irb(main):006:0> hoge[:huga]
=> nil
irb(main):007:0>
578 :
571 :2010/07/18(日) 15:20:11
579 :
571 :2010/07/18(日) 15:21:37
ちょ、、、、誤爆 orz
580 :
569 :2010/07/18(日) 15:59:56
>>577 うーん。参りました。理解できません。
そしてどこがどう理解できないのかを説明できない程度に重症ですが
これは多分Ruby自体に対する知識不足が原因だと思います。
もう少し知識を深める事にします。ありがとうございました。
581 :
デフォルトの名無しさん :2010/07/18(日) 17:50:26
>>580 たぶんこういうことじゃないかな
irb(main):001:0> :foo.object_id
=> 148418
irb(main):003:0> :foo.object_id
=> 148418
irb(main):004:0> "foo".object_id
=> 30586740
irb(main):005:0> "foo".object_id
=> 30576530
irb(main):006:0>
シンボルはobject_idが常に一緒(同じオブジェクト)
文字列はobject_idが変わる
582 :
デフォルトの名無しさん :2010/07/18(日) 17:51:55
追記:
というか
>>577 は答えになっていないのでは?
hash値とオブジェクトIDを混同してるな Stringのhash値は本体というかto_sで返るバイト列を元に計算されてる 一旦起動したrubyの中では「同じ」文字列はオブジェクトIDによらず同じhash値を返す 自作オブジェクト内にhash値を別途保存してしまった場合、不整合が起こることはあるだろう
ハッシュのキーはhashメソッドの結果の比較で判定する Symbol#hash = Object#hash よりも String#hash のほうが重い (その理由は Object#hash は object_id を見るだけなのに対して String#hash は文字列の比較のようなことが必要だから) だからシンボルのほうが効率がいい ということ?
効率の話か そりゃ文字列は文字列オブジェクトだからだよ オブジェクト作るというのはそれだけでコストだ { 1234 => {"id" => 1234, "data" => …} 1235 => {"id" => 1235, "data" => …}, 1236 => {"id" => 1236, "data" => …}, …} というデータ構造を作ったとき、 "id" と "data" はそれぞれが別途の文字列オブジェクトだ 仮にペアが1まんこあったら、アクセス用の名前を付けるだけのオブジェクトが計2まんこも作られる これを Symbol にすると、 { 1234 => {:id => 1234, :data => …} 1235 => {:id => 1235, :data => …}, 1236 => {:id => 1236, :data => …}, …} で、:id と :data は使い回されてたった 2個のオブジェクトだ ペアが何まんこあっても、アクセス用の名前を付けるだけのオブジェクトは2個だけ という理屈なんだが、ぶっちゃけ初心者のうちは気にしなくていい 慣れてきたら気にするようになる 最初は全部文字列上等
あー、Hash を pstore するようになったら気にするようになるかも 前者のファイルサイズは後者のファイルサイズよりもはっきり大きい
>>584 50点。
1.シンボルという概念が何かを調べる。
2.同一性と同値性について調べる。
3.「ハッシュのキーはhashメソッドの結果の比較で判定する」は間違い。
symbol を動的に利用することは出来ないのかな
JSON とかで
>>585 の前半のようなデータのときに
勝手に後半のような形に圧縮してくれるようなの
>>582 >>577 はHashに存在しないキーを指定するとどうなるか示してあるだけ
一連の流れとは関係ないよ
590 :
589 :2010/07/18(日) 19:52:57
だけじゃないや :hogeと"hoge"が同一でないと示したかったんだね
>>587 概念としてのシンボルは相当ややこしいんじゃないかね
とりあえずは実用上の意義に留めるべきでは
だいたい、Rubyでのシンボルの主用途はHashのキーぐらいしかないわけで、
Lispのようにシンボルが死活的に重要ってわけでもないし……
もとの質問者が知りたいことを読むとこのような回答に。 ・とりあえず文字列があれば機能的には事足りる。シンボルの存在は必須ではない。 ・固定の文字列を比較する場合にのみ、シンボルのほうがメモリを食わないし速い。 ・メモリの点での違いは、リテラルの文字列はコードが実行されるたびに生成されるが、 シンボルは同じ文字列であれば再利用される。 ・速度の点での違いは、文字列は毎回全部の文字を比較しないといけないが、 シンボルは同じオブジェクトかどうかを調べるだけでいい。 みたいな感じでいいのかな?シンボルの実装は知らんが。
593 :
571 :2010/07/18(日) 21:29:30
>>585 あーなるほどw
シンボルのobject_idが同じって確かにそういう事でもあるのか。
るりまの__id__の引用
> TrueClass, FalseClass, NilClass, Symbol, Fixnum クラスのインスタンスなど Immutable(変更不可)な
> オブジェクトの一部は同じ内容ならば必ず同じ object_id になります。
instance method Object#__id__
http://doc.okkez.net/static/187/method/Object/i/__id__.html シンボルが"Immutable(変更不可)"と言われると納得するわ
100とかTrueとかnilと同じ扱いなんだな
>>585 の前者と後者で実際にベンチとったらどうなるんだろうね
ソースコード中のリテラルは使いまわされてたいした差にはならないと推測
>>569 シンボルと文字列のパフォーマンスの差なんてとんでもなくわずかだから、
大量のデータを扱う場合か知的興味以外には、
パフォーマンスに焦点を当てた考えはあまり意味がないように思う。
シンボルがとても便利な場面の一つは、キーワードのように使う場合。
'A-00011' => 'デジカメ普及モデルA'
この場合「A-00011」は型番を想定したわけだけど、
型番は明らかにデータそのものでここではシンボルを使うべきでない。
:table_names => ['users', 'items', 'orders']
この場合の「table_names」はデータとは違ってキーワードのようなもの。
キーワードというのは少し言葉がずれてるかもしれないが、
大体わかってもらえるんじゃないかと思う。
キーワードにシンボルを使うことによって、
その意思を明示的に示すことができるのがいいところ。
rubyは名前つきパラメータをサポートしてないけど、
その代替としてハッシュを使うことが結構ある。
パラメータ名自体は本来データではないので、
そういうときもよくシンボルを使う。
>>594 リファレンスに書いてなかったっけ。
文字列や配列、ハッシュ、正規表現などは
実行時に毎回オブジェクトが生成されるって。
>>594 「同じ」見かけの文字列でもオブジェクトは毎回生成される
#!ruby -Ku
a = ["hoge", "hoge"]
p a[0].object_id, a[1].object_id
res:
-609614268
-609614278
「同じ」見かけでRubyが自動で使い回すのは #{…} のような埋め込みがない静的な正規表現だけ
#!ruby -Ku
1.upto(5) do |i|
p /hoge/.object_id
end
res:
-608897288
-608897288
-608897288
-608897288
-608897288
Ruby1.9 では文字列がエンコーディング情報つきになって重いので、気を遣うことには意味がある
「そもそもここではただの名前であって文字列である意義は本来ないよな」と考え付いたのなら
>>595 でよい
GC.disable require 'benchmark' p RUBY_VERSION COUNT = 10000 h1 = {} h2 = {} COUNT.times{ h1["_#{rand}".to_sym] = rand h2["_#{rand}".to_s] = rand } Benchmark.bm{|x| x.report{ COUNT.times{ h1.keys.each{|key|h1[key]} } } x.report{ COUNT.times{ h2.keys.each{|key|h2[key]} } } } #つづきあり
>>598 のつづき
# result1
"1.9.1"
user system total real
23.940000 0.750000 24.690000 ( 24.866216)
47.240000 0.970000 48.210000 ( 49.511738)
# result2
"1.8.7"
user system total real
41.450000 0.760000 42.210000 ( 42.266363)
72.930000 0.910000 73.840000 ( 73.977132)
あるいみズルいベンチではある。
#おわり
RubyInline使ってたらいつの間にか全部Cになってたでござるの巻
何でVC6なんでしょうか?
しがらみ
前スレ21のエントリ読んでみたりいろいろググったりしたんだけどいまだにProcがよくわからないです 今のところ使わなきゃならない事態に遭遇してないからいいっちゃいいんですけど ブロックの使い回しみたいなニュアンスに思えるんだけど本当はProcは何者なんですか?
1回しか回さなくてもいい、変数に格納しておいていつでも呼び出せるブロックっぽい手続き(procedure)オブジェクト
605 :
デフォルトの名無しさん :2010/07/21(水) 23:45:35
URLの抽出で悩んでいます 文字列から、URLを抽出し <a href=url>url</a> という形に置き換えたいです data = data.gsub(/.(http[s]?\:\/\/[\w\+\$\;\?\.\%\,\!\#\〜\*\/\:\@\&\\\=\ \_\-]+)./,"<a href=#{ }>#{ }</a>") こんな感じでできるかと思ったんですが、マッチした文章を変数か何かに保存していたりしないのでしょうか 一応、$&などがあるようですが data = data.gsub(/http[s]?\:\/\/[\w\+\$\;\?\.\%\,\!\#\〜\*\/\:\@\&\\\=\ \_\-]+/,"<a href=#{$&}>#{$&}</a>") $&は、この行が終わってから代入されるようなので <a href=></a> となってしまいます。 URLが一つしかないなら data =〜 /http[s]?\:\/\/[\w\+\$\;\?\.\%\,\!\#\〜\*\/\:\@\&\\\=\ \_\-]+/ data = data.sub(/http[s]?\:\/\/[\w\+\$\;\?\.\%\,\!\#\〜\*\/\:\@\&\\\=\ \_\-]+/,"<a href=#{$&}>#{$&}</a>") これでいいのですが、複数ある場合もあるでの困っています 何かいい方法はないでしょうか
%!<a href="\\&">\\&</a>!
>>606 > 文字列から、URLを抽出し
> <a href=url>url</a>
> という形に置き換えたいです
str.gsub(URI.regexp){|url| "<a href=#{url}>#{url}</a>"}
gsubの第二引数は初心者をふるいに落とすためのトラップです
慣用句的な表現で def fucker(options = {}) としておいて、 fucker(:to => @me, :fuck_you => :yes) としてよぶような表現をよく見かけます このようなメソッド定義の方法をブロックで行うことはできないでしょうか? define_methodやRailsのnamed_scopeのような、ちょっとしたブロックの処理が必要なときに 上記のように名前付き引数のようなHashをとるメソッドのように表現したい場合はどのようにしたものかと思いまして Ruby 1.8.7です。
答える気力を失わせるような識別子をわざわざ使うのは宗教かなんかか
>>612 >>614 そもそも ActiveRubyScript か RubyInstaller を使ったほうがいいような
>>610 define_method(:fucker) do |options|
options ||= {}
# ...
end
>618 あ、できてたみたいです、ありがとうございます
>>616 サンクス
行けました。
確かに引数省略すると、nilが入ってくるんですね。||= この慣用句的表現でいけますね
>>617 "INFO "ってあるけど、エラーじゃないので
>>620 違う
コマンド実行にまつわる英語を読む知識がないだけだ
よくわからないけど、 WARNINGがログにでたら注意して無視しろ ERROR以外が出たら無視しろ と先輩に教わったが、最近の人は教わらないのかな
そもそも英文を読めることが前提だから たとえば日本語のダイアログボックスの文言は、日本語を理解した上で、専門の言い回しを覚えなきゃならない この場合「*** is now default and will bel removed」 を英文として読めない場合、何を言ってもそもそも無駄 バージョンが上がるたびにこの手の文言は英語で追加されるわけで、いちいち英文解説までしてられん まあ、そろそろ日本語というか英語以外で表示すべき手段を提供すべきではあるんだが
英語を読めない、というか読む気がならプログラム辞めた方が良い。 ってひいおじいちゃんがいってた。
「できない」なら諦めろ
うん、gitと付き合っていけなさそうだしな
Rubyにかすりもしてない罠。
git小難しいよね
(´・ω・`)
>>625 一応、herokuの話題だから少し付き合うけど
どう「できない」かかこう。
633 :
625 :2010/07/24(土) 19:35:00
>>631 ActiveScriptRubyでやってるんですが
git initと入力してもコマンドがないって怒られてしまって。。。
何か足りないのでしょうか?
宜しくお願いします
コマンドプロンプトでchcp 65001ってやるとUTF-8になるって見つけてやってみたんですが、変えたらなぜかirbが始められません。 ほかの文字コードでも試してみたら、UTF-8は絶対できない、20932(EUC)はできない、50220(JIS)ではできたりできなかったりでわけわからん状況です。 なぜなんでしょうか?むしろこれで正常だったりしますか? winXPSP3でRuby1.8.7を入れてます。ruby -vでバージョン情報はどの文字コードでも表示されます。
>>634 Ruby 1.8だよな?
まず情報が古い
コマンドプロンプトでのchcp 65001でのUTF-8は実質使えない
・cygwin 1.7以降でLANG=ja_JP.UTF-8にて、cygwinのRubyを使う
・irbはコマンドプロンプトで我慢して、それ以外はcygwin 1.7上から使う
・SJISで我慢する(-Ksでrubyを起動するか、$KCODE='s')
俺も困っているから、文句はゲイツに言ってください
Win32版がW系のConsole API通してしゃべってくれたら解決する問題なの?
>>633 >>625 のリンク先に書いてあるじゃん。gitをインストールしないと
日本語使わないならmsysgitを、日本語使うならcygwin版のgitを入れる
>>634 ところで、目的は何?何をしたいの?
Webアプリ開発でUTF-8が必要なら、今後も難儀するだろうから
WindowsでもVirtualBoxにUbuntuとかCentOSいれたほうがいいと思うよ
いろいろ捗るぞ
>>636 あ、ありがとうございます!やってみます!
>>635 >>634 ありがとうございます。
たまたま見かけたからやってみただけなので深い理由はありませんでした。
教えてくれた方向で調べてやってみます。
640 :
634 :2010/07/24(土) 21:01:28
PowerShellISEでコンソールアプリが開発可能になれば万事解決なんだが・・・
642 :
635 :2010/07/24(土) 22:00:14
悪い、今試したらこれ間違ってたわ。 Ruby 1.8.7とWindows Vista SP2の環境ね > ・irbはコマンドプロンプトで我慢して、それ以外はcygwin 1.7上から使う ・Ruby Win32の$KCODE='u'でcygwin 1.7でもコマンドプロンプトではUTF-8を使うと化ける。irbもダメ 試したコマンド ruby -e "puts File.read('UTF-8.txt')" ・Win32版でUTF-8対応のターミナルとcygwin 1.7で、上記コマンドは特に化けない ただし、irbはirb.rbのエラーで動かなかった。 ・UTF-8対応のテキストエディタでエディタからのコマンドの実行結果をUTF-8で表示できるものは大丈夫か 何故かirbもirb.rbもエラー もちろんコマンドプロンプトでもnkfなどで適時変換すれば表示はできる 書いてみて思ったが、あたりまえのことしか書いていないな phpとかPython使いの人はWindowsユーザーは結構多いと思うけど UTF-8での開発はどうしているのか気になるわ
643 :
635 :2010/07/24(土) 22:04:51
ついでに、 > ただし、irbはirb.rbのエラーで動かなかった。 のエラーをエラーというとエスパー召喚するしか無いのでエラーログ貼っとく > .irbrc successfully loaded > 〜〜ruby/lib/ruby/1.8/irb.rb:270:in `dup': can't dup NilClass (TypeError) > from 〜〜ruby/lib/ruby/1.8/irb.rb:270:in `prompt' > from 〜〜ruby/lib/ruby/1.8/irb.rb:122:in `eval_input' > from 〜〜ruby/lib/ruby/1.8/irb/ruby-lex.rb:207:in `call' > from 〜〜ruby/lib/ruby/1.8/irb/ruby-lex.rb:207:in `prompt' > from 〜〜ruby/lib/ruby/1.8/irb/ruby-lex.rb:221:in `initialize_input' > from 〜〜ruby/lib/ruby/1.8/irb/ruby-lex.rb:228:in `each_top_level_statement' > from 〜〜ruby/lib/ruby/1.8/irb.rb:146:in `eval_input' > from 〜〜ruby/lib/ruby/1.8/irb.rb:70:in `start' > from 〜〜ruby/lib/ruby/1.8/irb.rb:69:in `catch' > from 〜〜ruby/lib/ruby/1.8/irb.rb:69:in `start' > from -e:17 以前はirbは起動した入力はできないような状態だったと思ったんだがいつのまにかエラー吐いてる
クッキーをセットして、別ページに移動したときにそれが存在しているか確認したいです。 条件式はどう書くのでしょうか? cgi = CGI.new cgi.cookies['hoge'].empty? でチェックしているのですが、うまくいっていないようです。
CGIは糞
>>644 クッキーの送受信について勉強するんだ
現行のライブラリは良くも悪くもクッキーを隠蔽しない
クッキーをハンドリングしてくれるフレームワークってないんだっけ?
環境 OS : WindowsXP SP3 IDE : NetBeans 6.71 / 6.8 / 6.9 Ruby : JRuby1.3.1 / 1.4.1 / 1.5.1, Ruby 1.8.6-p369 / 1.8.7-p249 いずれのRubyもFast Debugger(ruby-debug-ide)導入 ソースのエンコード : UTF8 これらの環境のうち、JRuby1.3.1以外でデバッグ実行し、ブレイクポイントでとめてStringを 格納しているの変数の内容を見ると、格納内容が日本語の文字列だと"[Binary Data]"と なちゃうんだけど、こんな事例みたことあるかな? 格納する文字列の先頭が半角英数字だとちゃんと表示されるんだよね。 NetBeansの問題かと思ってRadReils2でも試してみたけど同じような感じ。RadReilsの場合は 少しましでマウスでソースの変数をポイントするとちゃんと出る。
649 :
デフォルトの名無しさん :2010/07/25(日) 15:11:10
プログラム自体の初心者ですが自分の理解力が無くて本を読んでいてもよくわからない部分が多いです。 rubyで初心者にもわかりやすい説明がある本を教えてもらえませんか?
このスレ読んでお勧めの本がわからないならやめといたほうが吉 わりとマジで
なんて本の具体的にどの箇所がわからなかったのか、だな
FirefoxにFirebugがオヌヌメ
655 :
644 :2010/07/25(日) 17:39:11
>>646 調べてみます。
>>653 設定ー>プラバシーー>cookieを表示
で探すと存在しているようです。
>>655 >設定ー>プラバシーー>cookieを表示
>で探すと存在しているようです。
じゃああとはクッキーのパスを確認したらいいんじゃないかな。
>>655 それで調べるよりも、FirebugやLieHttpHeadersを使って、HTTPリクエストとHTTPレスポンスの中身を見て、
Cookie: と Set-Cookie: のデータを確認したほうがいいよ。
あとクッキーの調べ方は
>>644 であってると思うけど、念のために p cgi.cookies して調べてみては?
>>648 JRubyは詳しくないんだけど、NetBeansでUTF-8使う場合は、
NetBeansの起動オプションに -J-Dfile.encoding=UTF-8 の指定が必要なはずだよ。
IDE側(というかJavaのか?)の文字コード指定ね。
-J-Dfile.encoding=UTF-8 を起動時のショートカットか何かに設定するか、
netbeansインスコディレクトリ\etc\netbeans.conf の中の
netbeans_default_options="〜〜〜
の指定に文字列を追加すると起動オプションが指定できるから、
俺はそっちに -J-Dfile.encoding=UTF-8 を指定してる。
最後は、" でちゃんと閉じないとダメだよ。見りゃ分かると思うが。
# etc\netbeans.confファイルは、NetBeansをprogram filesとかにインスコしているなら、
# ユーザーごとのディレクトリにあるかもしれんので注意。ググったり、自分で探してみて
ちょっと調べたら、JavaはUTF-16だけど、JRubyはUTF-8で扱うみたいだね。
あと過疎ってるけど、NetBeansスレもあるからNetBeansで困ったらそちらも覗いてみるといいと思う
NetBeans Part6
http://pc12.2ch.net/test/read.cgi/tech/1273665879/
ありがとうございます。 p cgi.cookies['hoge'].empty?してみたところ、trueでした。 で、リクエストヘッダを見てみるとCookieの項目にセットしたものがありました。 p ENV["HTTP_COOKIE"] でも何も表示されないのでサーバー側でGETできていない気がするのですが、 どうでしょうか?
ですね
>>658 詳しい説明ありがとう!!
さっそくやってみたんだけど結果は同じでした。(ToT)
JRuby1.3.1 => Ruby 1.8.6互換
JRuby1.4.1,1.5,1 => Ruby 1.8.7互換
みたいだからこの辺も関係あるのかなぁ?
でもRuby 1.8.6-p369にしてみても"[Binary Data]"になってしまう。
JRubyからCRubyに変更しようかと思っていろいろやってるけどNetBeansでは
むずかしいのかなぁ?
やっぱみなさんはEclipseつかってるのかな?
>>661 ちょっと手元で試す暇がなくあまり協力できないのだが、さらっと試した結果
・NetBeans 6.9 RC2
・Ruby 1.8.7 p22では日本語を入れたStringの中身をデバッガで見ようとすると[Binary Data]となった
・JRuby 1.5.0ではちゃんと日本語が見られた
・ -J-Dfile.encoding=UTF-8は指定済み
・出力ウインドウではちゃんと日本語で出ている
・ソースコードはUTF-8なのを他のエディタで確認済み
試したサンプルコード:
$KCODE='u'
require 'pp'
i_love_ruby = "私はRubyです 表が怖い噂のソフト"
pp i_love_ruby
puts i_love_ruby
NetBeansのMLで日本の担当の人もいるしそっちで聞いたほうがいいかも
あとNetBeansのバグトラックに登録されていないか確認してみるといいかも。
NetBeansニ年くらいつかってるけど全然気づかなかったわ issue見ても無いような気がする。 NetBeansとRuby win32とステップ実行でさらに日本語という組み合わせで使っている人がほとんどいないのかも。 irbとテストでほとんど事足りるからな… これはMLで報告したほうがいいな ML登録してないなら代わりに報告してみるから言ってください
>>662 >>663 >>664 皆さん協力ありがとう。
こちらでもNetBeansでCRuby,JRubyともうもう一度チェックしてみたけど
JRuby1.3.1より大きなバージョンでは[Binary Data]となりました。
変なことに文字列の先頭に半角文字がある場合は日本語も含めて
ちゃんと表示される。
"漢字"だと"[Binary Data]"、"1漢字"だと"1漢字"。
MLには参加していないので報告してもらえるとありがたいです。
とある本に、Cのrandは精度が低いからMT法を用いた方法で〜という記述があったのですが Rubyのrandの精度はどの程度のものなのでしょうか。
Rubyの乱数生成器はMT法だお
669 :
デフォルトの名無しさん :2010/07/26(月) 20:33:15
日曜日からRuby始めました。 こちらの皆さんはIDEまたはEditorに何をお使いでしょう? 1.8まででしたらRDEというモノがあったらしいのですが、こちらは2007年で開発が止まっているようです。 ・1.9対応 ・ソース整形機能アリ で、お勧めがありましたらご紹介ください。
自分はEmacsだが特にお勧めはしない
IDE系は勧めない せめてRubyの動作をよく知ってから使うべき 開発者にとってプリミティブすぎるというRuby側の要因も大きいからあまり大きな顔はできんのだが 着色とオートインデントさえあればなんでもいいんじゃなかろうか むしろコマンドプロンプトとかの使い方のほうが
Radrails使ってる。
foo = <<EOS apple orange EOS bar = <<EOS apple kimjongil EOS #この2つの変数の差分をとりたいのですが、どうやるのが一般的でしょうか?
>>674 foo.split - bar.split
RDEは超個人的に1.9対応をやって、大体問題なく動くレベルで動かすのに成功している。 (1.9の文字エンコーディング関連とかでちょい注意がいるけど) ただ、変数ウィンドウ関連とか力技で対応したところがあるんで、 出来れば公式でちゃんと対応してくれるのが理想なんだが、もうバージョンアップは望み薄かねえ。 割と軽量で手軽に使えるので重宝してるんだけどねえ。
678 :
669 :2010/07/27(火) 22:27:31
沢山のResに感謝。
特に
>>672 は参考になりました。ありがとうございます。
自分、Webの編集にAptanaを使ってるので、さしあたりということでこちらのプラグインを使ってみましょう。
>>671 自分のメインはJavaとPHP、C#ですが、確かにRubyはかなり勝手が違いますね。
「vat = $/ hoge」なんて、一体何が書いてあるのかすらわかりません(苦笑
関数の呼び出しにカッコを使ってないところにも、かなり面食らってます。
質問です。 ちょっとした機能の分離にmoduleを使うと思うのですが、 module内でloggerを使いたい場合の定石みたいな物ってあるんでしょうか? もしくは何か参考になるソース(gemとか)があれば教えてください
なんかよーわからんが、ふつうのクラスでは @log.info('info!') if @log と書いてたんだが モジュールに分けたらインスタンス変数読めないじゃんばかばかまんこ、という話なら モジュールでも include 先のインスタンス変数は読めるし書ける もし、C1#foo と C1#foo を M に分離させて C1 と C2 からは M.foo で呼びたいときに、 M.foo 内でログ吐かせるときはどうするのまさか毎回引数で M.foo(params, logger) かYO、という話なら M のクラスインスタンス変数とかに状態を保存するのが自然ちゃ自然 module M class << self attr_accessor :log end def self.foo; puts "#{log}!" if log; end end class C1 def initialize; end # ログ設定しない版 def run; M.foo; end end class C2 def initialize; M.log='yes'; end # ログ設定する版 def run; M.foo; end end irb> C1.new.run irb> C2.new.run yes! irb> C1.new.run yes! Module オブジェクトのインスタンス変数をいじるため、誰かがどこかで設定したらそれをずっと使うので注意
話はそれるけど、moduleで分割した機能にLoggerなんて入れないよ、普通の設計でわ。 使う側にとっては「んだよこのモジュールは、勝手にロガーなんてつけおってからに…」となる。
検索、寡占化の懸念も ヤフーとグーグル提携
ttp://www.tokyo-np.co.jp/article/economics/news/CK2010072802000060.html Yahoo! JAPANだけでなく、NTT子会社の goo、NEC の BIGLOBEも、
Google から検索エンジンを提供されている。これは危険な兆候だ。
2008年の米国、ヤフーとグーグルが合意した提携に司法省が反対し、ご破算になった。
オレはこれから bing を使うことにした
各エディタは、url からブラウザを呼び出すそれぞれの機能はあるよね
require 'kconv'
prefix='
http://www.bing.com/search?mkt=ja-JP&q= '
ARGF.each{ |line|
unless line =~ /\S/; print line; next; end
line = line.chomp.toutf8
line.gsub!(/([^ a-zA-Z0-9_.-]+)/n){
'%' + $1.unpack('H2' * $1.size).join('%').upcase;
}
line.tr!(' ', '+')
puts prefix + line;
}
683 :
669 :2010/07/28(水) 11:14:41
>>678 失礼、式が違ってましたね
var = $/ unless hoge
でした。unlessが条件修飾子というのは分かりましたが、「$/」ってどんな条件なんだ?
うーむ、Rubyは複雑怪奇・・・。
>>683 けっこうRuby使ってたのに $/ とか知らなかったんだがw
$/に関しては
>>3 にあるリファレンスマニュアルやHTMLヘルプを検索したら一発で分かるけど、
読み込み時に分割するのに使う文字コードみたいだね。デフォルトだと \n だから、改行ごとに読み込んだデータがわかれると
なんとかかんとか unless hoge
は、いわゆる後置unlessだな。 hogeが偽のときに「なんとかかんとか」を実行する
>>683 のコードで言えば
if !hoge
var = $/
end
と同じことのはず
この説明は、旧リファレンスだと"unless 修飾子"ででてくる。
新リファレンスのHTMLヘルプだと出てこないんだけど構文ってHTMLヘルプのキーワードにはいってないのかな?
Perlだと一気読み(slurp)するのに$/いじったりするけど RubyだとFile.readで済むからあんまり使わないのかも
少なくともRubyの人のスクリプトではない
>>681 じゃあモジュールのファイル書き換えて p で表示するのでいっすか
warnでいいよ
perlからとってきた $ で始まる変数は1.9で消せばよかったのに。
>>689 ほほう $1 や $2 の利便性を捨ててもよいと申すか
perlからとってきた $ で始まる変数は1.9で消せばよかったのに。
$stdout とか $stderr がなくなってもいいの?
require 'sys' sys.stdout おし
IO::STDOUT と IO.stdout と IO.stdout= でなんとかなる たぶん
>>694 そういうのは File::STDOUT ってなんですか? という継承の問題が…
require :hoge, :fuga, :piyo できるやうにしる
複数 require の要望は昔からあるな なんで導入されないんだっけか まあいいや、初心者さんの質問どうぞ
>>690 MatchData#captures しか使わんのでいらんのですわ
>>692 そんなんperlにあったっけ?
>>696 >>698 IronRuby とかは require が複数の引数取れるんだけど、
複数取れるようにするとそういうのが死ぬよ
そういうのが死ぬよ、とは?kwsk
703 :
669 :2010/07/29(木) 16:55:09
>>684 おお、お返事感謝!
>if !hoge
> var = $/
>end
・・・ぜひともこういう風に書いてほしいんですけどね。他の言語を使ってる人間としてはw
これはPerlの構文なのかな? 少しはPerlも舐めたんですが、こんな構文は見たことなかったですねぇ・・・。
>$/に関しては
>>3 にあるリファレンスマニュアルやHTMLヘルプを検索したら一発で分かるけど、
(少なくとも普通には)ググれないんですよ(涙) 多分、特殊文字として扱われてしまっているんでしょうが・・・。
>/$
「perl 特殊変数」でぐぐればいいやん
>>703 (MSの)HTMLヘルプだと$/ みたいな記号でも検索できるよ
>>3 参照
>>703 その3行をたった1行でシンプルに書ける!
というのがRuby
rvm で Ruby をインストールしたら,emacs 上から,xmpfilter が使えなくなりました. ruby: No such file or directory -- xmpfilter (LoadError) ターミナルからは使えます. ~/.rvm/gems/ruby-1.8.7-p299/bin に,rcodetools 一式が入っていること, exec-path に,~/.rvm/gems/ruby-1.8.7-p299/bin が入ってることは確認しました. どこを疑ったらいいでしょうか??
Ruby 関係ないシリーズだな
rvm は魔法を使ってるわけじゃなくて、単に
rvm use 1.8.7 とした瞬間に
現在のシェルの環境変数 $PATH の先頭へ
自分の知ってる ruby 1.8.7 の bin ディレクトリのパスを挿入する
ということで、emacs の起動の仕方によってはもろちん
シェルの環境変数なんて引き継がれてないので意図どおりのバージョンが呼ばれない
ttp://github.com/senny/rvm.el を使うと便利になんとかなるかも
>>706 1行で書くスタイルはPerl由来っしょ
Perlやってて後置修飾子見たことないなんてどんだけー。
舐めた程度って言ってるんだから突っ込まなくてもいいだろうに ちなみに漏れもunless修飾子いやunlessは大嫌いです
>>703 >これはPerlの構文なのかな? 少しはPerlも舐めたんですが、こんな構文は見たことなかったですねぇ・・・。
しね
>>711 あまりに複雑な条件を突っ込むと可読性がひどいことになるが、
節度を守って使う限りは簡潔で読みやすいでしょ
3行が1行になるのは意外に大きいよ
後置型 unless の問題点は if not として使用されることが多いということ if not と unless は「変数名は a b c でいいよね」と同じレベルでやっぱり違う
if !hoge ; var = $/ ; end
>>703-704 「Ruby 特殊変数」でぐぐってもでるね
$に記号ついている=特殊変数というのがわかったと思うし今後は大丈夫だろう
>>705 確かに、新マニュアルの方のHTMLヘルプのキーワード検索でも出た
Ruby の特殊変数って Perl のと 100% 互換?
よーしパパ、Io言語みたいにKernel.ifを実装しちゃうぞー 既出感高いが #!ruby module Kernel def if_true(bool, &block) if bool block.call return true else return false end end def if_false(bool, &block) return if_true(!bool, &block) end end class TrueClass def else return self end end class FalseClass def else yield return nil end end 続く
719 :
718 :2010/07/30(金) 11:04:23
続き
if __FILE__ == $0
TEST_EXAMPLES = [true, false, nil, "Matz", 1234, 12.00]
TEST_EXAMPLES.each.each do |x|
print "#{x.class} #{x.inspect}: "
print "if_true() == "
if_true(x){ print "true" }.else{ print "false" }
print ", if_false() == "
if_false(x){ print "false" }.else{ print "true" }
print ", if == "
if x then print "true" else print "false" end
puts
end
puts
require 'test/unit'
class ExtIfTest < Test::Unit::TestCase
TEST_EXAMPLES.each do |x|
define_method "test_if_true_with_#{x}" do
result = nil; if_true(x){ result = true }.else{ result = false }
assert(result == (x ? true : false))
end
define_method "test_if_false_with_#{x}" do
result = nil; if_false(x){ result = false }.else{ result = true }
assert(result == (x ? true : false))
end
end
end
end
gistにも置いた
http://gist.github.com/499720
720 :
718 :2010/07/30(金) 11:09:01
書いてて気づいたんだけど、一行で書きたいんならこれでいいのか if x then hoge end C言語のブロックなしのif構文がイヤだからこうなってるの?
hoge if x でいいような
723 :
707 :2010/07/30(金) 14:26:28
>>708 rvm.el 使ったら,うまくいきました.
ありがとうございました.
質問です sortに対するsort_byのように、uniqに対するuniq_byのようなことを実現する方法もしくは類似のメソッドはないでしょうか? sites = [〜〜〜] sites.sort_by(&:title) # titleでソートしたい sites.sort_by{|x| [x.title, x.url]} # titleとurlでソートしたい 同様な使い方で、 sites.uniq_by(&:title) # titleの値を条件として重複を取り除きたい sites.uniq_by{|x| [x.title, x.url]} # titleとurlを条件として重複を取り除きたい のようなことがしたいです。 わかりにくいですが、ActiveRecordで例えれば、find(:all, :group => :title) のような:group指定のような雰囲気です
725 :
724 :2010/07/30(金) 18:33:52
ActiveScriptRuby 1.9 は、ruby1.9 という名前でインストールできますか? また、C:/ruby/ruby.exe と C:/ruby1.9/ruby1.9.exe など区別できますか?
727 :
デフォルトの名無しさん :2010/07/30(金) 22:48:32
Ruby やってて短く簡潔な・便利な・かっこいい・感動した・変態的な書き方を教えてください。 例えばこんな感じです。 @second = 2 @hoge = @first || @second || @third p @hoge #=> 2 p [1,2,3].map(&:to_s) #=> ["1", "2", "3"] よろしくお願いします。
>>727 RubyGemsになるが
> p [1,2,3].map(&:to_s) #=> ["1", "2", "3"]
require 'rubygems'
require 'map_by_method' # gem install map_by_method
p [1,2,3].map_to_s #=> ["1", "2", "3"]
p [1,2,3].map_to_s_and_to_f #=> [["1", ], "2", "3"]
## map|collect|select|each|reject|sort_by|group_by|index_by に使える
# gem install what_methods
>> require 'what_methods'
>> "foo_bar".what? "FooBar"
"foo_bar".camelize == "FooBar"
"foo_bar".camelcase == "FooBar"
"foo_bar".classify == "FooBar"
=> ["camelize", "camelcase", "classify"]
途中投稿しちゃた p [1,2,3].map_to_s #=> ["1", "2", "3"] p [1,2,3].map_to_s_and_to_f #=> [["1", 1.0], ["2", 2.0], ["3", 3.0]] ## map|collect|select|each|reject|sort_by|group_by|index_by に使える
自分のクラス名は、self.classで取得できます では、自分の実行中のメソッド名を取得する方法はありますか?
なんかむかしのログでそんなのがあった。
どういう状況でそれが必要になるのか興味がある
caller
caller実行してみて意外だった。スタックトレースみたいな配列返ってくるだけだったので。 Hash(かCallerクラスのインスタンス)のArrayみたいな扱いやすいメタ情報返ってくるかと思った。 そのへんないってことは、特に必要なかったからか と思ってみたら、メソッド名はいってねーじゃん? 調べたけど __method__ でいいんじゃないの?
質問なのですが、 引数でファイルが指定されていたら中身をデータとしてよみこむか、 そうでなく標準入力があるならその中身を読み込むか、 どちらもないなら、デフォルトのデータを読みたい(__DATA__以下など)場合に str = (ARGF || DATA).read p str みたいに書いてたのですが、ARGFはnilにはいらないみたいですし、 ファイルの指定がなくて標準入力からの入力になった場合に、入力待ちになり停止してしまいます。 標準入力がない場合はスルーして、DATAから読む方法はないものでしょうか?
test.rb src = STDIN.tty? && ARGV.empty? ? DATA : ARGF puts src.read __END__ [contents after __END__] $ ruby test.rb < stdin.txt [contents of stdin.txt] $ ruby test.rb arg.txt [contents of arg.txt] $ ruby test.rb [contents after __END__]
csvファイルを読み込んで、ある列の文字列がファイルパスを書き込んだファイルから探し出して そのファイルパスを出力するといったものを書いたのですが、getsは先頭から一行ずつ読み込むと思うのですが 思う通りになってくれません。なにかソースが変でしたら教えてください open("file.csv") do |data| while l =data.gets row=l.split(',') open("path.txt") do |f| p1 = Regexp.quote(row[9]) p2 = Regexp.quote(row[11]) p3 = Regexp.quote(row[12]) while line = f.gets if line =~ (/p1/ && /p2/ && /p3/) printf line else printf "none" end end end end end
目に付いたのは、条件式のところ p1 p2 p3 は正規表現に入れて問題ないようにエスケープしただけの単なる文字列 正規表現の中に変数名を書いてもただの文字列 正規表現を&&で結んだものと比較するというのは、最後の正規表現と比較するのと等しい 単純に直すと /#{p1}/ =~ line && /#{p2}/ =~ line && /#{p3} =~ line かな。 他は細かく見てない。
CSVの中にファイル名が書いてあるなら、わざわざ正規表現にしなくても、 文字列同士の比較(==)で済ませられるような気もする。
失礼。lineはファイル名だけの行ではないのね。 んー、それでも line.include?(p1) && ... でいいような。
743 :
739 :2010/08/01(日) 03:44:42
>>740-
>>742 /#{p1}/ =~ line && /#{p2}/ =~ line && /#{p3} =~ line でもinclude?(p1) &&...
でもいけました。
何が問題だったかと言いますと、CSVのデータに空白が含まれていたのに、
ファイルパスが書かれたテキストファイルには含まれていない。
たまたま空白が含まれていないデータだけマッチングしていたので、先頭から読み込んでいないと勘違いしていました。
お世話おかけしました。
> /#{p1}/ =~ line && /#{p2}/ =~ line && /#{p3} =~ line inject厨の出番か?
数行のスクリプトを表す文字列があってそれを外部からrubyで実行させる場合、 テンポラリファイルとして保存して実行する以外にもうちょっとスマートな方法ってありますか? char *sciprt = "for i in 1..10\n" " puts 'hello'\n" "end\n"; あと、こういう任意の数行のスクリプトを機械的にワンライナーに置き換えられる コードやユーティリティがあったら教えてください。
>>745 vm_eval.c にある rb_eval_string 使えないのかな?
ダイハツpopen
>>745 rb_eval_string で実行とかそんなうまい話があるわけが
$ cat test.c
#include "ruby.h"
int main(void)
{
ruby_init();
rb_eval_string("puts 'hello ruby from c'");
return 0;
}
$ gcc test.c -lruby1.8 -I/usr/lib/ruby/1.8/i486-linux
$ ./a.out
hello ruby from c
でけた
>>749 exerbってこれやってるだけだったりする?
>>750 exerbをよく知らないのでわからない
>>750 requireのフックとかもやってるはず
brubyでぐぐれ ていうかそれだけしかやらないなら拡張ライブラリのパッキング/展開はどうすんだと
Ruby1.8 で irb使ってる人に質問 何も設定しない場合 p やメソッド返り値の自動表示で日本語が "\346\227\245\346\234\254\350\252\236" みたいになってるわけだけど、これを常に日本語表示させて使ってる人はいる? irb> "日本語" "\346\227\245\346\234\254\350\252\236" irb> $KCODE="u" "u" irb> "日本語" "日本\350\252\236" # 古い 1.8.7 なのでまだ化けてる
マルチはご法度
754 自己解決しますた。
>>754 普通、irb は $KCODE か ruby -Ku 相当を設定してから使う
ruby 実行に -K オプションを普通はつけるのと全く同じ理屈
初期状態を尊重して「化け」てる状態のままにしている人のほうがたぶんレア
むしろ、「化け」ないようにしておくほうが -K オプションとの関連でも健全かと
>>757 755以外のレスをした記憶はないなあ
LLスレは何でも食いつくから、むしろ放置w
Windows版のRubyパッケージのirbは昔デフォでShift_JISの設定がされてた記憶 今はプレーンだが
netbeans6.9にruby1.19-p429をいれたら、ソースを実行するたびに Error loading gem paths on load path in gem_prelude can't modify frozen string <internal:gem_prelude>:69:in `force_encoding' <internal:gem_prelude>:69:in `set_home' <internal:gem_prelude>:38:in `dir' <internal:gem_prelude>:76:in `set_paths' <internal:gem_prelude>:47:in `path' <internal:gem_prelude>:286:in `push_all_highest_version_gems_on_load_path' <internal:gem_prelude>:355:in `<compiled>' っていうエラーが出るようになった(でもソース自体は実行できてる)・・・ PC買い替えで新規に入れたからどこか設定抜けてるんだろうか、誰か助けてorz
>>763 >netbeans6.9にruby1.19-p429をいれたら
はruby1.91-p429の間違いです。
765 :
デフォルトの名無しさん :2010/08/02(月) 12:08:51
マルチポストはたのしい。 まず質問があちこちにひろがる。 んで、あちこちで回答がつく。 するとなぜか怒りながらそれらをリンクしてくれる人がいる。 すると別々の視点で行われた回答をマージできる。 自己組織化っていうのかな、これ。たのしいね。
>>765 それは楽しいんじゃなくて便利って言うんだよ。
で、そのプロセスを想像したお前が楽しんでるだけだ。
OK Waveとか教えて何とかクンとかの質問サイトなんてシステム的にマルチポストするようになっている時代なんだし マルチと思ったらスルーすればいいだけ osieteなんとかとかMSNのなんとかにいちいちマルチだシネとか書き込んでるのかよ
教えて何とか系のQAサイトは、一つのQAシステムに、複数のビューが付いてるようなもんだと 思っている。
769 :
デフォルトの名無しさん :2010/08/02(月) 17:59:39
全ての行の末尾に句点(「。」)を加えるプログラムが欲しいのですがなかなか作れません。 「input.txt」が入力ファイル、「output.txt」が出力ファイルになるようにして以下のように書けばいいのは分かるのですが、 中身の部分が問題なんですよね。 open("output.txt","w"){|oi| open("input.txt"){ |io| …… } } どなたかよろしくお願いいたします。
タグ: 先生仕事してください ここに病院を建てよう 質問してみた uy先生 時間の無駄遣い 効率厨 無駄に無駄のない無駄 頭おかしいシリーズ
io.each_line{|ln| oi.write ln.sub(/$/){"。"} } でどうかな?
file = open('input.txt').read file.gsub!(/$/){'。'} open('output.txt','wb'){|f| f.write(file)}
>>769 標準入力と標準出力つかおうぜ。
プログラムはフィルターだ!
>>771 正規表現使うまでもない気がするぜ!
>>772 最悪のコードだぜ!
通はこれ↓どや!
$stdin.each_line do |line|
line[-1] = '。'
$stdout.puts line
end
while line = gets line[-1] = '。' puts line end これでもええで!
data = open("input.txt").map{|line| line.chomp + "。"}.join("\n") open("output.txt", "w").write(data)
ストリームにmapぶちかます人って…
File(IO)ってEnumerable includeしてるから、map行けるのかよw
メモリがあふれなければどうということはない!
>>775 それ、openしたファイルオブジェクトをcloseしてないよ
二行スクリプトでそんなこと気にしてどうする。
初心者スレ故、ご配慮頂きたい。
ガベコレ任せじゃダメかもしれん資源というものを、 初心者のうちから気にするのはいいことだ。
>>780 ブロックを使わないファイルのopenはRubyでは「ありえない」
今のところ
>>772 のみが妥当域
>>783 file = open('input.txt').read
これも閉じてないから妥当じゃないし。
どう「ありえない」のか言ってみたらいいよ どこかのスレであつものに懲りてなますを吹くって言ってたけど まさにこれだな
file = open('input.txt').read.close
Rubyの本を読んでいると、本によって括弧の省略規則が違って、自分はどうすれば いいのか迷います。 とりあえず、引数がないときや、puts、attr_accessor等の組み込み系は省略すれば よいのはわかったのですが。 みなさんはどうしているのでしょうか?
>>789 File.read('in.txt')
Ruby1.9.1からはWindowsからも rb で使える
>>788 メソッドチェーンを(後々)繋げる可能性がある場合はカッコをつける
obj.mes(arg).chain のつもりで obj.mes arg.chain と書いてしまうのはわりと悲劇
>shebangを記述する場合、#!とパスの間には半角スペース1個を挿入する。 これとか >ファイルは必ず改行文字で終了する。 これってなゆたやのオリジナルじゃなくて一般的なん? #!とパスの間にスペース入ってないのとか ファイルの最後の改行がないのとか 普通にいっぱい見かけるけど
>obj.mes(arg).chain のつもりで obj.mes arg.chain と書いてしまう ne-yo
shebangにそのスペースが必要な場合がある、という説を、 (具体的に必要なシステムはわからない)別の人も、どこかで聞いたことが あると言っていたので、どこかにソースがある、らしい。 最後の行に行末の改行がないとおかしくなるプログラムもあるので、 最後の改行は必ず付けるようにしたほうが無難。
>>795-796 d
無難ってことには同意だけど
どっちの例でもそのソフトの方が悪いと思うなぁ
横からすまんが #! /usr/bin/env ruby -Ku っていうのはいかんの?
shebangはソフトというよりexecシステムコールの挙動にまつわる都市伝説のようなものだし、 行末のほうはBNFで <行> := <本体> "\n" と定義してある場合に不都合だ、ということで、最後の行の場合だけ特別扱いしなきゃならなくなる。 「そのソフトの方が悪い」とか、意味わかんない。
>都市伝説のようなもの えっ?
戻値があるか、一行で書けるブロックは {} を使って
それ以外は do end のルールに合わせてたけど、
>>792 を見ると、
ブロックは {} で統一する、とあるな。
こっちに合わせた方がいいのかなあ
自分は{}で書けるところは極力{}を書くようにしてる。 * タイプ数が増えるじゃないか。 * メソッドチェーンが超違和感あり。↓とか。 array.map do |e| e.foo end.bar.baz * 1行は読み難いじゃないか。↓なにこれw array.map do |e| e.foo; end * 1行←→複数行への変更をするときいちいち{}←→doendに書き換えるの?ねーよw
C, C++ は言語仕様でソースコードの末尾が改行文字で終わっていない場合は未定義動作、と規定されている なのでそれを前提としたツールがあるってことだろうね
>>775 あれできたっけ?と思ってirbだと閉じなくてワロタw
こうだよな?
open("output.txt", "w"){|f| f.write(data)}
これもっと簡単にならないの?
ファイル読むなら、
>>790 の
File.read("input.txt") とかFile.readlinesあるじゃん?(元はIO.readか)
File.write("output.txt", "w", data) くれよ
>>807 お、公式のIssueにあったのか。気付かなかった。ありがと
結局最も推奨されるべきコードはどんななの? こんな感じでよいの? data = File.read("input.txt").gsub(/$/, "。") open("output.txt", "w"){|f| f.write(data)}
text = File.open('input.txt', 'rb'){|f| f.read}.gsub(/$/){'。'} File.open('output.txt', 'wb'){|f| f.write(text)} ・ open-uri がめんどくへえので面倒でなければ open ではなくFile.open を使う ・ Fileオブジェクトの生成は必ずブロックつきメソッドで行う ・ 外見ががっかりなので開いて即閉じる場合はブロックを1行で書く ・ File.read は Ruby1.8 ではバイナリスイッチついてないので配布や公開では File#read を使う ・ gsub 第2引数は魔境なのでブロックつきを使用するように自分を訓練付けておく ・ ファイル書き込みにはバイナリスイッチを自分でつけておく ・ 書き込みメソッドは問題がなければ print ではなく write を使う
お前ら動的にクラス定義する簡単な方法はありませんでしょうか? 具体的には以下のようなコードだと、当たり前なんですが@testが設定できません。 instance_evalにヒアドキュメントで#{@test}を渡すと、@testが文字列として渡ってしまいます。 #!/usr/bin/env ruby def debug(*args) p [caller.first, *args] end 1.times do @test = "unko" class Chinko debug self, @test def self.print_test debug self, @test end end debug self, @test Chinko.print_test end 結果 ["hoge.rb:9", Chinko, nil] ["hoge.rb:15", #<Object:0x288f994 @test="test">, "test"] ["hoge.rb:11:in `print_test'", Chinko, nil]
812 :
811 :2010/08/05(木) 20:46:58
>>811 class Chinkoの前に、
class Chinko; self end.instance_variable_set(:@test, @test)
と書いて行けたのですが、
むしろ、ひとつ外のブロックのself(この場合classの外のself)にアクセスする手段はないものでしょうか?
>>811 クラスオブジェクトChinkoのインスタンス変数を定義したい?
クラスオブジェクトChinkoのインスタンスのインスタンス変数を定義したい?
814 :
811 :2010/08/06(金) 02:32:09
>>813 何がしたいかを伝えたほうがいい気がしてきました。
RSpecのspecファイルなどで、自作moduleのテストというか振る舞いを記述したいと思っています。
そこで、specファイルのdescribeブロックのbefore(:each) にて、
テストしたいmoduleをincludeしたclass Hogeを定義し、
例えば、Hogeのクラスメソッドfoobar(moduleで定義されているメソッドです)を検証したい場合、
beforeで生成したダミーデータ(@test)をfoobarに渡して、
specファイルのit ブロックで @test と結果を照合するといったことをやろうとしていました。
ところが、動的にクラスを定義しようとしてうまくいかず、
>>811-812 の質問をしたしだいです。
今回の所は、例で言えばbeforeブロックでHogeを定義しmoduleをincludeして、
class end の外で、Hoge.foobarに @test を渡して呼び出すようにしてやれば問題ありませんでした。
また、
>>811 のように、@testを利用したメソッドを新たに定義する必要はなかったようです。すいません
書いていてよくわからなくなってきたのですが、
RSpecでモジュールの振る舞いを記述するときの定石みたいなものが
すでにあるのであればいいのですが
module M def put_str; "str"; end end describe "M" do before :each do @obj = Object.new end describe "#put_str" do before do @obj.extend(M) end it 'returns "str"' do @obj.put_str.should eql('str') end end end
816 :
811 :2010/08/06(金) 06:23:42
>>815 サンクス
includeでなくてextendだった…
Object.newのインスタンスを利用すればいいんですね。なるほど
817 :
811 :2010/08/06(金) 06:58:16
>>812 はおかしいというか不適切ですね。
Chinkoクラスのインスタンス変数を定義していますが、
>>811 の例ではクラスメソッド内では確かに使えますが、
Chinkoのインスタンスのインスタンスメソッド内では使えないですよね。
>>812 の例からわかってないように見えるので、
>>813 みたいなツッコミが入ったわけですか
モジュールのクラスメソッドという言い方は変ですね、モジュールの特異メソッドということです。
朝から理解するのには重いことが書いてあるな そのように分けて動作するように作ってあるからが答なんだろうけど クラスメソッドの定義先はクラスオブジェクト module M def self.m; end end の m メソッドの所属は 定数 M という呼び名の Module クラスのインスタンス クラスメソッドというものは本当は存在してなくてシングルトンクラスのインスタンスメソッドで include と extend は自分を追加する ancestors 自体が違うとか なんかそういうすごいことをわかりやすく説明してくれる勇者が
RHGというサイトみたらあったんですが、クラスと違いモジュールの特異メソッドは継承されず、
includeが内部的に継承を利用しているとなると、確かにincludeだけでは特異メソッドはできないですね
実装上の都合なのか、そうでないのかはこれみるだけだとよくわからないですが
> またクラスの継承の場合にはクラスの特異メソッドも一緒に継承したが、
> モジュールの場合は特にそのような仕組みはなかった。
> 従ってモジュールの特異メソッドはインクルード先クラス(またはモジュール)には継承されない。
> 特異メソッドも継承したいときはModule#append_featuresをオーバーライドするのが常套手段だ。
第4章 クラスとモジュール
http://www.loveruby.net/ja/rhg/book/class.html >>820 この辺の状況はirbかスクリプト側から挙動を確かめることは出来ないでしょうか?
singleton_class でぐぐると何か出るかも 出ないかも
gemcutterとかrubyforgeのDNS落ちてる?
ひぐちカッター
かしゆカッター
復旧してた
Mac版からRubyのスレが消えたのはどうしてなの
Macで使ってる人が少ないから
830 :
デフォルトの名無しさん :2010/08/09(月) 18:08:54
nokogiri のインストールに失敗してしまいます。 以下は出力されたログの内容です。 >gem install nokogiri Successfully installed nokogiri-1.4.3.1-x86-mingw32 1 gem installed Installing ri documentation for nokogiri-1.4.3.1-x86-mingw32... No definition for parse_memory No definition for parse_file No definition for parse_with No definition for get_options No definition for set_options Installing RDoc documentation for nokogiri-1.4.3.1-x86-mingw32... No definition for parse_memory No definition for parse_file No definition for parse_with No definition for get_options No definition for set_options (Windows7 / Ruby1.8.6 / RubyGems1.3.7) アドバイスよろしくお願いします。
832 :
デフォルトの名無しさん :2010/08/09(月) 18:19:43
>>831 ありがとうございます。
先の環境では紹介して頂いたActiveScriptRubyを利用しています。。
mingwのgemパッケージががインストールされるはずがないんだがなー
835 :
830 :2010/08/09(月) 18:37:26
>>833-834 どうやらその方と同じ症状のようです。これまた日付も。
解決策が発見されるまで放置するしかないでしょうか。。
インストールできてるじゃん ドキュメントの一部が失敗してるだけ。 俺なら気にしない。
失敗してるというか、ソースコードにドキュメントがついてない関数があるだけでは。
838 :
830 :2010/08/09(月) 21:50:43
>>836-837 Nokogiri目当てにRubyを始めたのですが、困ったものです;
require "rubygems"
require "nokogiri"
p Nokogiri
=> uninitialized constant Nokogiri (NameError)
このように、Nokogiri クラスが認識されていません。
とりあえず @tendorlove に聞いてみな。日本語でおkだから。
おっと @tenderlove だた。ひげの山男な。
C:\>gem environment RubyGems Environment: - RUBYGEMS VERSION: 1.3.5 - RUBY VERSION: 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32] - INSTALLATION DIRECTORY: C:/Program Files/ruby-1.8/lib/ruby/gems/1.8 - RUBY EXECUTABLE: "C:/Program Files/ruby-1.8/bin/ruby.exe" - EXECUTABLE DIRECTORY: C:/Program Files/ruby-1.8/bin - RUBYGEMS PLATFORMS: - ruby - x86-mswin32-60 mswin32でない場合壊れてる
842 :
830 :2010/08/09(月) 22:16:41
>>840-841 Environmentの方を調べてみました。どうやら問題はなさそうです。
RubyGems Environment:
- RUBYGEMS VERSION: 1.3.7
- RUBY VERSION: 1.8.7 (2010-06-23 patchlevel 299) [i386-mswin32]
- INSTALLATION DIRECTORY: C:/Program Files/ruby-1.8/lib/ruby/gems/1.8
- RUBY EXECUTABLE: "C:/Program Files/ruby-1.8/bin/ruby.exe"
- EXECUTABLE DIRECTORY: C:/Program Files/ruby-1.8/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-mswin32-60
もう少し様子見させて頂いて、最悪の場合は tenderlove さんに聞いてみたいと思います。
どうもありがとうございました。
ためしにnokogiriインストールしてみたけど
>>830 と全く同じメッセージがでてインストールは普通にできてたから
>>830 は関係ないと思う
なんかメッセージだすならそれがエラーなのか警告なのか書いてくれっていう。>gem
845 :
830 :2010/08/09(月) 22:26:39
>>845 irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "nokogiri"
=> true
irb(main):003:0> p Nokogiri
Nokogiri
=> nil
irb(main):004:0> Nokogiri::HTML
=> Nokogiri::HTML
irb(main):005:0> Nokogiri::HTML("<html />")
=> #<Nokogiri::HTML::Document:0x2326e9e name="document" children=[#<Nokogiri::XML::DTD:0x2326c46 name="html">,
#<Nokogiri::XML::Element:0x2326c0a name ="html">]>
847 :
830 :2010/08/09(月) 22:45:42
>>846 ありがとうございます。問題なさそうですね!
もう行き詰ってしまったので、解決が出来次第また書き込みさせて頂きます。
>>830 には1.8.6と書いているのに
>>842 のgem environmentは1.8.7な件は?
複数rubyがあって違うほうに入っちゃてるんじゃないの?
849 :
830 :2010/08/10(火) 00:10:14
>>848 すみません、説明不足でした。
実は途中でRubyおよびRubyGemsを再インストールしたのです。
RubyInstaller の gem.bat が残ってるに2票
Program FilesにRubyいれたら、パスがらみでgem関連でバグることある問題ではないかな? あとWindows 7でProgram Files以下なら、管理者権限必要なはずだけど とはいえ、Nokogiri自体はインストールできているみたいだし違うか
cgiで重い処理をした場合に 最後にまとめてどーんじゃなくて 結果を逐次表示することってできますか?
お聞きしたいのですが、 WindowsやLinux(Debian, Ubuntu)でRubyGemsから容易に入れられる 形態素解析ライブラリはありませんでしょうか? 有名だと思われるMeCabはないようで、個別にインストールが必要のようでした
個別にインストールしたくない理由は?
>>856 そりゃひとつのマシンの中に複数の同じプログラムが入ってたり
どのパスからどのバージョンのdllがいつ読まれるのかがわからなかったり
コンパイルオプションがどれだけついてるのかがgemのreadmeに書いてなかったり
付属に付属してるライブラリコンポーネントがどこの誰のバージョン何なのかがはっきりしなかったり
そういうドキドキさ加減が好きだからに決まってるだろ
>>857 iconv.dll馬鹿にすんあ
対応してるエンコーディング名の一覧引き出すだけでも一苦労だ
>>853 どうもです。こんな感じかな。
ちょっと大掛かりな気もしますが。
とりあえずAJAX初めてですが何かやってますね。
>>855 だったらMeCabをgemで入れられるように、あなたがしてくれればいいじゃないの!
このいくじなし!
なんでそんなに必死なの?
どこが必死に見えるのかよくわからん
>>861 確かにそうですね。簡単に出来そうならやってみます。
wktk
自分専用スクリプトの rspec の describe や it を英語で書いてる時間がなんか無駄だなと思った
>>866 自分専用なら日本語で書けばいいと思うけどね
BDDはいいんだけど、サクッっと作りたい時はちょっとの時間も惜しいのであまりspec書かなかったりするんだよな
どうもね
1枚の書き捨てスクリプトは結局書かない、
でも適当に書いたスクリプトがそこそこ使えたので、
改良していくうちにちゃんとspec書かないと、なんてあとから思うとなかなか本末転倒w
1,2時間くらいの時間の合間に気になるアイデアためしてみるか、みたいなときにいちいちspec書いてられないんだけど、
普段から日々書いてないから、速く書けない気もするし、
慣れたからって、書かない時より同じ速度でかけるわけでもないし、
・・・ようするにお前らどうしてますの?と聞きたいです
WEB+DB PRESSのvol.54 2020のWebサービス即日開発という特集だと、 moriq.comの人(=Apolloの人)によるRubyとRailsの開発方法も少し載ってた 特定単語含むTwitter検索の内容を表示するwebアプリを作る目的にて ・irbで「Twitter検索のRSSを取得してパースすればいけそう」といったようなあたりをつける ・railsとrspec(rspec-rails, モックのrr)で「つぶやきを得るAPI」を作る ・同様にクローラーを作る ・コントローラーやviewなどのガワを作る という流れだったな モック使って、トップダウンから(APIから)作っていく感じだった。 いわゆる最近いわれる「レガシーコード」じゃない、最初の方からBDDだとそういう流れが当然かも知れないけど この手の本のちょっとしたアプリを1からBDDで作る、みたいなのもっと情報欲しい 定番のRailsアジャイル本は名前に反して、テスト後回しだし、入門用であまり面白みがなかった 「名前に反して」というのはアジャイルという単語の勝手な受け取りかも知れないが
いまファイナルβの、PragProgから出るRSpec本はそんな感じ。外側から作っていく。 お題はマスターマインド(codebreaker)だな。
>>867 後から見たらコードはあってるけど英語が間違ってるとかあるな
> ちょっとしたアプリを1からBDDで作る というのが本質的な手順上の誤りなんじゃないかと最近思う チェーンソーだけで作る木工彫刻のような すごいけど、チェーンソーで作らないほうが普通に精緻に見やすいの作れるよね使い方間違ってるよね チェーンソーで作りましたという注釈をつけないとただのラフで稚拙な削り物だよねみたいな
872 :
デフォルトの名無しさん :2010/08/12(木) 08:09:20
BDDってなんですか?
Behavior Driven Development
二分決定木の話をするのがセオリー
>>874 こんな時じゃないと興味持ってもらえないからな…
>>869 もうすぐ出る方のThe RSpec Bookの方かな
買ってたと思うのでちゃんと見てみるわ
しかしこの本、延々と新しい書き方に合わせて修正してたり、
最近になってRails3とRSpec2にも対応するとか言っているみたいだし、
本当にもうすぐ出るのかw
1年半くらい出る出るいいながらずっと更新され続けているような気がするが、
PragProgのベータ本ってどれもこんな感じなのか?
877 :
デフォルトの名無しさん :2010/08/12(木) 10:15:09
String#scanってどういう動作してるんですか? マニュアルを読んでも繰り返しを開始する条件と開始位置について書かれてませんでした
開始する条件?開始位置? 常に繰り返すし、常に最初からじゃないの?
880 :
デフォルトの名無しさん :2010/08/17(火) 23:36:02
perlで言う`コマンド` はrubyではどうやればいいのでしょうか? よろしくお願いします。
同じようにやったらいいじゃない
正規表現の書き方によっては、無限ループみたいな感じになって 処理が戻ってこなくなる可能性ってあるのかな?
バックトラックが爆発することはある
scanと先読みはたいへん相性が悪い
スタックを使い切るのはこの組み合わせばかり
>>878 の質問もこのへんなんだと思う
正規表現自体に「何度も適用する」という処理はないわけで
同じパターンが繰り返すのは見つけられるんだろうけど 二重ループ見たいなのは無理?
詳説正規表現を読むのが一番の早道。
String#scanはけっこう地雷だと思う 可能ならsplitしたほうがいい
Ruby屈指の素敵メソッドだと思ってました 具体的な地雷例出してくれるまで納得しないんだから
可能ならなるべくscan使ってるわ splitとかperlっぽくてダサダサじゃん
えっ…
インターンシップでrubyを使って設計をする課題を与えられたのですが言語全般全く使ったことがなくよくわからないことがあるので質問させてください。 企業先のPC(ruby1.?←わかりません)では「gets=a」と入力できたはずなんですが家のPC(よくわかなかったのでruby reference1.8をインストしました) では「a=gets」がエラーとなってできません、何か間違ってるのでしょうか? 後 => の意味をぐぐったのですが「ハッシュの定数定義。」とか「連想配列」と書かれていていまいちよくわかりません。 明日休みなんで企業先の方に質問できないので教えてください。
>>891 連続申し訳ありませんgets=aは勘違いの可能性が非常に高いので無視してください。
2つ目だけでお願いいたします。
明日朝イチで本屋行ってたのしいRubyでも買ってきてつかーさい
こんな状態でもインターンってとってくれるのか
これはひどい釣り
ユーモアとかジョークは好きだけど、whyのやつはなんか読む気にならないんだよな。 なぜだろう
why?
ツイッターでは #whyday というタグが使われていたが、_whyが消えてもう1年(2009/8/19)なんだな。
900 :
896 :2010/08/21(土) 10:20:42
俺も読む気にならん 読みにくい
> www.okisoft.co.jp ノーサンキュー
Rubyで縦20*横30の行列を簡単に作る書き方は無いのでしょうか? Matrix.I(20)では20*20の行列ができてしまいますし… m1 = Array.new(20) do [0,0,0,0,0,0,0,......] end のように書くしかないのでしょうか? C++のように int m1 [20][30]; と一行くらいで書ける方法があったらご教授ください。
Loggerとか、いろいろなオブジェクトの中で参照したいオブジェクトってどのように管理すればエレガントでしょうか。 1 大域変数で 21世紀に大域変数はいかがなものか?まあ動くけど 2 何かのクラスのクラス変数につっこむ AppContextみたいなクラス作って設定情報とか一緒に突っ込む... というのもちょっとどんくさい?
>>904 m = Array.new(20).fill {Array.new(20).fill(0)} かな。
多用するなら narray ライブラリも調べてみるといいかも。
m = Array.new(20).fill(Array.new(20).fill(0)) ではダメ。
>>905 シングルトン的なオブジェクトなら後者かなぁ。Railsだと Rails.logger がある。
>>904 Rubyの多段配列は行列に見えるだけで本当はぜんぜん行列じゃないので注意
クwwラwwwwスwwww変wwww数wwwwwwwww なんだがまあクラス変数しかないんでクラス変数かクラスインスタンス変数に入れるしかないよね スレッド使って複数の人が状態変更したりしたときによく破綻するけど ライブラリとして公開したときにほぼ確実にIssueに来る うぜえ スレッド上で使うな いや使ってもいいんだけど、これスレッド実行中に変更って何をどういう使い方してるんだよ
>>906 おぉぉ、できました、ありがとうございます!
>>908 忠告ありがとうございます…が、私にはちょっと理解できません…
もしよろしければ、行列に見えるだけで本当は行列じゃない、の部分をもう少し詳しくお願いできませんか?
どういう時に気をつけておかないと問題が起こったりするのかも出来れば後学として知りたいです。
m[1][2][3] は m[1,2,3] ではなく m.[](1).[](2).[](3) で、 m[](1) こと m[1] の返り値オブジェクトに [] メソッドがないと動作しない、みたいな話だと思う
Cの配列は多次元配列じゃないみたいなめんどくさい話かと思った
>>907 ,909
やはりクラス変数かー
まあLoggerとアプリケーション設定しかいれない予定です。ありがとうございました。
>>905 >>913 ちょっと遅いけど、Rails 2.3.xのloggerの構造が参考になるかも
・Rails環境でグローバルにどこでも使えるのはRails.logger
・RAILS_DEFAULT_LOGGERが設定されているならRails.loggerはそっちを優先して返す
例えば、.irbrcに標準出力にログだすようなloggerを設定しとくと
Rails用のirb環境であるscript/consoleでそのままコンソールにログを出力できるので、
発行されるSQLクエリーログなども実行しながらその場で確認できたり
・RAILS_DEFAULT_LOGGERがないなら、Rails初期化時に開発者によって設定されるloggerを使う
config/environment.rb の Rails::Initializer.run に渡されるブロックの中で設定されたものってことね
・Railsで使われるActiveRecord、ActionController、ActionMailer等のライブラリもloggerをもっていて、
起動時にRails.loggerが自動で割り当てられる
厳密なところはちょっと違うけど、大体こんな感じ
gemで入れて、rails-x.x.x/lib/initializer.rb読んでみるといいかも
大域変数へのアクセスとクラスへのアクセスの差がわかりません
よーわからんが、スコープがシステムで制限されて極めて局地的であるか、 あるいは変更行為に排他処理などが元々組み込まれているのでない限り、 あらゆる変数は大域変数としての危険性からは逃れられない $つきのグローバル変数は悪だよねと言いつつ、 トップレベルのインスタンス変数と def だけでプログラム作ってたら、 そのインスタンス変数はグローバル変数と基本変わらない きちんとクラスとメソッドを作っていても、データの受け渡しに巨大な Hash ひとつを使ってて あらゆるメソッドでその Hash にペアを追加したりキー削除したり値読んだりしてるのなら、 その Hash はグローバル変数とたぶん同じだ
Railsもグローバルな定数やモジュールごとの定数を使い分けてるけど、
>>914 のRAILS_DEFAULT_LOGGERなんて、
> ・RAILS_DEFAULT_LOGGERがないなら、Rails初期化時に開発者によって設定されるloggerを使う
とあるけど、実際に実装では
silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger }
とRAILS_DEFAULT_LOGGERを上書きだからなw
Rails.loggerはRAILS_DEFAULT_LOGGERが設定されていればRAILS_DEFAULT_LOGGERの方を使うが、
定数を上書きしているなんて思わんw
ログ関連の実装は開発者の「ログ出力って普通こんな使い方だ」という偏見に満ち溢れている Logger オブジェクトを指定するインスタンスメソッド #log= が クラスインスタンス変数を毎回変更するようになってるとか インスタンスごとにログ出力変えるというログの使用法はこの人の頭の中にはないのか ないんだろうなあ
メソッドおよび関数の引数渡しについて質問です。 RubyでFixnumクラスを引数にした場合、値渡しになっているようです。 def foo(x); x.div(2); end a = 10 foo(a) pp a -> 10 一方で、StringクラスやArrayクラスを引数にすると参照渡しになっています。 def bar(x); x.push('world');end b = ["hello"] bar(b) pp b -> ["hello", "world"] 「プログラミングRuby 第2版」を読んでいるのですが、参照渡し・値渡しに関する記述は 特に見つからず、どういうルールで引数が渡されるのかよくわかりません。 Rubyではクラスによって値渡しになるか、参照渡しになるかが自動的に決まるのでしょうか? 明示的に値渡し、参照渡しを指定する書き方はありますか? よろしくお願いします。
Fixnumは実装の都合で値渡しになる。2^32-1 か 2^64 -1 までの整数だな。 あとはtrue、false、nilか。 Cが分かるなら、どういうビット表現になってるか調べてみてもいいかも。
divメソッドって非破壊でしょ その例じゃ値渡しなのかわからない
def foo(n); n += 1; puts n; end => nil irb(main):028:0> x = 1; puts x; foo(x); puts x 1 2 1 => nil irb(main):026:0> x = 2**64-1; puts x; foo(x); puts x 18446744073709551615 18446744073709551616 18446744073709551615 => nil irb(main):027:0> x = 2**64; puts x; foo(x); puts x 18446744073709551616 18446744073709551617 18446744073709551616 ありゃりゃ。
n += 1 も n = n + 1 で、要は再代入だから意味ないな。 整数に破壊的メソッドって何かあったっけ?
たしか
>>920 の言う実装の都合により無いよ
無理やりFixnumクラスに破壊的メソッドを定義して試すと
>>919 の言う値渡しにはなっていないことが分かる
irb(main):001:0> class Fixnum;attr_accessor :bar;end
=> nil
irb(main):002:0> def foo(x); x.bar = 1;end
=> nil
irb(main):003:0> a = 10
=> 10
irb(main):004:0> a.bar = 10
=> 10
irb(main):005:0> foo(a)
=> 1
irb(main):006:0> a.bar
=> 1
925 :
919 :2010/08/22(日) 16:24:38
なるほど。実は全部参照渡しだけど、Fixnumは破壊的メソッドを持っていないので 呼び出された側で呼び出し側のオブジェクトの値を変更することができないということですか。
初心者スレなんだっけ Rubyの人は、Integerクラスをクラスとかメソッドとかの説明には使わないんだ 扱いが特殊だから
immutableなので状態を気にしなくても まあまず問題は起こらない
どこに 1 というデータが入ってるんですかという問に答えられないので嫌
>>919 Rubyではクラスによって値渡しになるか、参照渡しになるかが自動的に決まるのでしょうか?
プリミティブ以外は全部参照
Javaかよ!
Rubyのは、いわゆる参照の値渡しなんじゃね?
実装の話をすると、ほとんどのオブジェクトは内部的には構造体になっていて、普段は ポインタのやりとりで扱ってる。 Fixnumなんかは、ちょっとした細工を行うことで、整数値自体を、普通のポインタなら 絶対に取らないポインタ値に変換して、ポインタと見なせる形で受け渡ししている。
つながらないね。 MacPortsで入れればいいさ。
>>935 確かめてもらいありがとう
cidarっていう別の環境見つけたからそれにします
>>932 ポインタは絶対奇数にならないから
Fixnumの方を2倍して1足して奇数のポインタに見せかけてるんだよな
>>933 違うよ。
もし参照渡しだったら、この例でのzzの要素だけでなくzz自体に対する代入結果が
メソッドの外側にも反映されないといけない。
irb(main):001:0> x = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> def hoge(zz)
irb(main):003:1> zz[2] = 4
irb(main):004:1> p zz
irb(main):005:1> zz = ['a', 'b', 'c']
irb(main):006:1> p zz
irb(main):007:1> end
=> nil
irb(main):008:0> x
=> [1, 2, 3]
irb(main):009:0> hoge(x)
[1, 2, 4]
["a", "b", "c"]
=> nil
irb(main):010:0> x
=> [1, 2, 4]
内容が書き換わるのは参照渡しであることの十分条件じゃないから。
本書いてる人が参照渡すから参照渡しとか言ってるから困っちゃう今日この頃
941 :
Perl忍者仙人モード ◆M5ZWRnXOj6 :2010/08/22(日) 23:38:44
なにこのrubyのきもい文法 ありえないよ クソマカ+クソガリ+Matz新車ばっかりわいてるゴミすれですね もうオレの目につけられたここのスレは潰される運命
よく間違えられるんだけど変数に参照入れるのと引数の参照渡しとは別だ そもそも破壊的メソッドでFixnumの中身が書き換えられるなら、++があってもいいよな
参照を参照することと参照渡しとは別だよねえ 日本語に訳してしまうのが問題なのかもしれない、とちょっと思ってみる
参照渡しってPASCALで初めて習ったな Cでポインタ渡しを習う前だった
オブジェクト渡しのほうがわかりやすい
C++の参照渡しが敗因
ありゃあエイリアス
>>940 だから、Rubyでは参照渡し「ではない」という例なんだが。
参照渡しじゃないとしたら コピー渡し? 実体渡し? 値渡し?
参照の値渡し、ポインタの値渡し
参照渡しではなく参照の値を渡しているんですね
ついこの間、同じ話題をやってたのにまたかよ
同じ話題を繰り返してほしくなくばテンプレを旧札で用意しろ 警察には電話するな
まとめwikiみたいなのがあると便利かもそうじゃないかもという気はする
>>952 関係あるから言ってんだろうが馬鹿が
知らねえ奴に関係あるかどうか判断できんのか
Linux+ApacheでRubyのCGIを表示したいんですが、(IEだとOKなのに)FirefoxではMIMEがtext/plainになってしまいます。 一応、先頭で「print "Content-Type: text/html\n\n"」は出力しているのですが、他に何か(apache周りも含めて)「ここ見とけ」という点はありますか? ・・・なぜか、IISだと両方ともちゃんと表示されるんですよねぇ・・・。
print "Content-Type: text/html;\n\n" Perlじゃないんだからそんな書き方はさっさと止めなさい
ライブラリを使わないならこれは print が最適だと思うが
文字列が改行で終わる場合の puts は print と同じ、というルールはわかりにくいと思うにゃん irb> puts "にゃん" にゃん irb> puts "にゃん\r\n" にゃん irb> puts "にゃん\r\n\r\n" にゃん irb> あと HTTP ヘッダのヘッダ区切り改行は CRLF にゃん puts だと仕様を満たせないにゃん
;が足りてないという指摘じゃないか
Rubyには;はいらんだろ
964 :
デフォルトの名無しさん :2010/08/24(火) 10:06:11
良スレage
965 :
957 :2010/08/24(火) 10:48:09
>>958-963 ・・・申し訳ありません。ボケてました。問題の行の上にprint文があった・・・(涙
IISではこの辺を勝手に補正していた模様。便利なのか不便なのか分かりませんねぇ。
これからは「とにかくContent-Typeはロジックよりなにより一番上に書く」というコトにしておいたほうがいいかもしれません。
(もちろん、ダウンロードなどでContent-Typeが変化する/させる必要のある場合はまた別でしょうが)
ともあれ、皆さんのご指摘に改めて感謝。
966 :
デフォルトの名無しさん :2010/08/24(火) 10:51:12
>これからは「とにかくContent-Typeはロジックよりなにより一番上に書く」というコトにしておいたほうがいいかもしれません。 はっきり言うとこれが一番良くない テンプレ使え
プログラミング入門 -Rubyを使って- というサイトで勉強を始めたんですが、目次3の変数と代入というところで 行き詰っております。 a = 1+1 puts '1と1で'+a 上記の記述では、エラーが出てしまうんですが、理由がわかりません。 お分かりになる方、解決方法のご指導をよろしくおねがいいたします。 文章が下手ですいません。
>>968 ありがとうございます。
無事に解決出来ました。
>>969 すいません。スレ違いだってことですか?
そうだとしたら、申し訳ございませんでした。
スレ違いじゃないよ
>>969 は今の段階では無視しておk
強制の型変換をネタに暇つぶししたくなったら見ればいい
> a = 1+1 > puts '1と1で'+a > > 上記の記述では、エラーが出てしまうんですが、理由がわかりません。 例に出てないことをしたらそりゃエラーになると思うわけですが。
>>973 それは「分かる人には分かる」という類の説明だと思う
型付けが弱い言語では数を文字列型へ暗黙に変換する言語もあるし、
Rubyであっても、#to_strで文字列への変換を試みるメソッドもある
例をいじってみる事自体はいい発想だと思う
975 :
デフォルトの名無しさん :2010/08/24(火) 14:43:24
Javaは型付けが弱い言語なんですねわかります
>>972 今の段階では、見ても何の事だかさっぱりでした。
いつか、理解できるようになりたいです。
>>973 たしかに、おっしゃる通りなんですが…
自分なりにいろいろやってみて疑問に思ったものでして・・・
だからRubyの「けいさんきごう」もメソッドなんだって '1と1で'+a は '1と1で'.+(a) つまり String クラスの + というメソッドに引数 a を渡してる という処理だ 引数 a がドットの前のオブジェクト(レシーバ)と同じクラスのものじゃない場合、 引数を小細工して同類に変換して暗黙適度に処理してくれるかどうかについては基本的に信用できない だから + メソッドのマニュアルを読むしかなくて、そしてマニュアル読むと、特にそんなことはしてないことがわかる ということで、整数(Integer)は「文字列に足せない」というのが結論 という手順を踏む 別に俺らだって全メソッドの動作を記憶してるわけじゃねえw 適宜マニュアル読んだりしてる たとえば整数を表す Integer クラスの + メソッドは、 引数が自分とは違う小数(Floatクラス)であっても適当に便利なほうに変換して加算して返す Ruby の + 記号自体に演算ルールがあるわけじゃなくて、レシーバのクラスの該当メソッドの動作に依存してる
いやそういうRuby固有の話はいまのところどうでもよくて。 文字列と文字列を + でつなぐ 数と数を + で足す こういう例は出てるけど 文字列 + 数 なんてのは例にないわけだし、 なんか良くないような予感というか、そんなものがしないですかね、 ということ。 例からパターンを類推したうえで、そのパターンから外れてるな、とか 思いませんかと。
文字列+数 が文字列になる、ってのは他の言語を考えてもわりとありがちな仕様だと思うんだけど…。
別に自動でタイプ変換してもいいよね しなくてもいいけど、してもらってもいい 変換しますという言語があってもふーんとしか思わん
質問者のように、違うパラメータを与えて試してみるということ自体は悪くない。
values = [1,2,3, ... 25000] みたいな巨大配列を別ファイルに保存しておいて main.rbでインクルードして使いたいのですが、どうすればいいでしょうか?
>>983 別ファイルのローカル変数を読むことはできない
クラスかモジュールのメソッド返り値なり定数なりに入れておいて、メソッドなり定数なりで呼び出すしかない
985 :
983 :2010/08/24(火) 22:59:01
まじっすか。めんどくさ ありがとうございました
yaml
メモリ強烈に喰いそうだなw
>>967 できるようにしてみた
class String
alias :"+_orig" :+
def +(rhs)
return self.send(:"+_orig", rhs.to_s)
end
end
けど、単一ディスパッチで Fixnum等 + String を既存の意味を損わずに実現す るのは面倒だな。
不満なく動くなら、メモリどんだけ食ってもいいんじゃね?
>>957 -
今時、
> print "Content-Type: text/html;\n\n"
を生で書く需要とタイミングが知りたい
Ruby(に限らないが)はmethod_missingで定義してないメソッド処理できるせいで、 メソッドが有るか無いかのメソッド拡張したり、Railsのソースとか見てるとかなり必死w
>>979-982 整数 / 整数 が 整数 になるかどうかも言語によって違うし、
けっこうえっ?って思う部類だよな
1 / 2 が 0
コマンドの返り値がabcだとして select = コマンド select.replace('ab','cc') これだと上手くいかないのは何故
>>994 ・エラーメッセージ嫁
・リファレンス嫁
結論からいうと、String#replaceのことだと思うが、それ部分文字列置換のためのものじゃない
>>994 エラーメッセージで
> ArgumentError: wrong number of arguments (2 for 1)
と出なかった?
「引数が1個を想定しているところに2個入ってる、死ねよ」と書いてある
この時点であ、文字列の置換メソッドじゃないのかもとピンと来て欲しい
そこでriなりrefeなりリファレンスマニュアルなりでString#replaceを調べる
↓
文字列まるごと置き換えるメソッドだとわかる
↓
部分文字列の置換メソッドねーのかよ!
↓
「ruby 文字列置換」でググる
↓
(略)
ググる以外の方法だと、マニュアルを全文検索とか、irbでwhat_methods gemを使うとか
> require "what_methods"
> "abc".what? "ccc", "ab", "cc"
"abc".sub("ab", "cc") == "ccc"
"abc".gsub!("ab", "cc") == "ccc"
"abc".gsub("ab", "cc") == "ccc"
"abc".tr!("ab", "cc") == "ccc"
"abc".tr("ab", "cc") == "ccc"
"abc".sub!("ab", "cc") == "ccc"
=> ["sub", "gsub!", "gsub", "tr!", "tr", "sub!"]
ただし、what_methodsは副作用あるメソッドも普通に実行するので注意
わるい、
>>994 はPythonスレにも透過されてるマルチポストっぽい
たくし〜どらいば〜 苦労人とみえて〜
1000ならタクシードライバーMatzがマッチョになってLarryちゃんを救出
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。