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

Ruby 初心者スレッド Part 30

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

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

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

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

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0763デフォルトの名無しさん2009/09/09(水) 13:51:50
>>761
$ jeweler --rspec hogeeee
    create .gitignore
    create Rakefile
    create LICENSE
    create README.rdoc
    create .document
    create lib
    create lib/hogeeee.rb
    create spec
    create spec/spec_helper.rb
    create spec/hogeeee_spec.rb
Jeweler has prepared your gem in hogeeee
$ ls hogeeee/
LICENSE README.rdoc Rakefile lib spec
0764デフォルトの名無しさん2009/09/09(水) 13:59:55
>>762
http://i.loveruby.net/ja/rhg/book/minimum.html
コンテキストとしてのself とか main とか
0765デフォルトの名無しさん2009/09/09(水) 14:01:25
>>762
トップレベルにも self として参照できるオブジェクトがある。
ほとんど単に Object.new したものだが、文字列化すると main
と返すようになっている点だけちょっと違う。
puts self
#=> main
p self
#=> main
puts self.class
#=> Object
0766デフォルトの名無しさん2009/09/09(水) 14:07:31
>>763
これ知ったとき、spec_helper をどっかの rubygem からコピペして
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
を全ファイルの先頭に自力で書いてた俺超涙目
0767デフォルトの名無しさん2009/09/09(水) 15:20:22
メソッド内部で print とかされて標準出力に表示されている結果を
rspec でチェックすることはできませんか?
0768デフォルトの名無しさん2009/09/09(水) 15:36:33
putsはObjectがincludeしているKernelのメソッド。

putsを呼ぶ時点のselfにspecからアクセスできるなら
ソレ.should_receive(:puts).with(出力)
などで可能だと思う。
0769デフォルトの名無しさん2009/09/09(水) 15:38:36
>>767
$stdout = StringIO.new
で溜め込むとか
0770デフォルトの名無しさん2009/09/09(水) 16:12:05
>>768
「メソッド内部」と断ってるし普通アクセスできないと思う
0771デフォルトの名無しさん2009/09/09(水) 16:43:30
>>770
class Greeter
def hello(name)
puts "hello, #{name}"
end
end

このような位置のputsはspecで
@greeter.should_receive(:puts).with('guest')
でテストできるけど、さらに奥深くだと無理だろうってことね。
0772デフォルトの名無しさん2009/09/09(水) 17:01:10
内部ってどのくらいなん、というのに依存するな

汎用的なのは$stdoutねじ曲げる>>769か
これ使ったことあるけど、なんかrspecで書いてる気がしないんだよな
stdout マッチャとか display マッチャとか作るべき
0773デフォルトの名無しさん2009/09/09(水) 17:18:54
そりゃまあ、らしく書くのに実装の隠蔽は欠かせない
0774デフォルトの名無しさん2009/09/09(水) 17:21:07
lambda{ @obj.greeting }.should display('hello!')

こんな感じ?
Proc オブジェクト使うのはこれはこれで微妙に不評なんだよね
0775デフォルトの名無しさん2009/09/09(水) 17:51:58
>>763
ジュエラーか。ジュエリストのほうがかっこいいな。
最近ご無沙汰なんだが、hoeとかnewgemはもう古いの?
0776デフォルトの名無しさん2009/09/09(水) 18:10:42
hoe がイヤ過ぎるから newgem や jeweler が出てきたのでは…
0777デフォルトの名無しさん2009/09/09(水) 18:55:17
hoeとかrubyforgeとかって基本的にgemを作るときに要るもので、
配布物を使う人には無用のものだと思っていたのだけど、
なんで依存しているgemがあるんだろう、という疑問。

07787772009/09/09(水) 18:59:06
自己レス。
作者がadd_development_dependencyを知らないだけなのかな。

0779デフォルトの名無しさん2009/09/09(水) 22:29:32
ある文字列をN文字ずつに分解するのはどうやりますか。
たとえば 'abcdef' を2文字ずつに分解して ["ab", "cd", "ef"] のようにします。
よろしくお願いします。

0780デフォルトの名無しさん2009/09/09(水) 22:37:38
N = 2
'abcdef'.scan(Regexp.new('.{%d}' % N))
0781デフォルトの名無しさん2009/09/09(水) 23:44:39
すごく初歩的な質問なのですが、Rubyのドキュメントはどこにあるのでしょうか?皆さんは何を参照していますか?
公式HPを見ましたが、Rubyの文法を簡単に説明しているだけで、標準ライブラリの細かい仕様を調べたい時などには役に立たないと感じました。
たとえばgemにインストールしたライブラリであればgem serverコマンドでRDocリファレンスが見れますが、標準ライブラリのRDocのようなものは無いのでしょうか?
バージョンは1.8でも1.9でも構いません。よろしくお願いします。
0782デフォルトの名無しさん2009/09/09(水) 23:55:43
>>781
http://www.ruby-lang.org/ja/documentation/
とそのリンク先は見た?
07837812009/09/10(木) 00:50:23
>>782
ありがとうございます。
そのドキュメントは見ましたが、文法の解説という感じなので自分が求めてるものと少し違いました。
言語が違いますがたとえばhttp://java.sun.com/j2se/1.5.0/ja/docs/ja/api/のように、
各クラスにどんなメソッドとフィールドがあって各メソッドの引数は何か、というのが一目で分かるようなAPI的なものを探しています。
0784デフォルトの名無しさん2009/09/10(木) 00:55:42
>>782の旧リファレンスマニュアルで十分な気がするんだが
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFA5AFA5E9A5B9A1BFA5E2A5B8A5E5A1BCA5EBA1BFCEE3B3B0A5AFA5E9A5B9.html
ttp://www.ruby-lang.org/ja/man/html/_C5BAC9D5A5E9A5A4A5D6A5E9A5EA.html
0785デフォルトの名無しさん2009/09/10(木) 01:02:58
>文法の解説という感じ
何を言ってるんだおまえは
http://doc.okkez.net/static/187/library/_builtin.html
0786デフォルトの名無しさん2009/09/10(木) 01:05:47
www.ruby-doc.org/core でいいんじゃね?
0787デフォルトの名無しさん2009/09/10(木) 01:18:47
職場の頭の悪いJava厨が>>783と同じようなこと言ってたな
0788デフォルトの名無しさん2009/09/10(木) 02:03:14
Rubyって連結リストみたいなListのデータ構造はないのでしょうか?
配列とハッシュしかみあたらないのですが。。。
0789デフォルトの名無しさん2009/09/10(木) 02:05:35
>>781
体裁が gem の rdoc に一番近いのはここの Core API のところかなあ
http://www.ruby-doc.org/

書籍だと内容的にはちと古いがピッケル本のライブラリ編とか
0790デフォルトの名無しさん2009/09/10(木) 02:15:16
>>788
Arrayでおk
0791デフォルトの名無しさん2009/09/10(木) 02:30:57
>>788
連結リストを何に使うの?
キューやスタックなら配列で十分だぞ(#shift, #unshift, #push, #pop)

Lispの処理系を作るとかいう話なら自分で作るべき
0792デフォルトの名無しさん2009/09/10(木) 04:25:14
>>779
str.scan(/../n)
Nが毎回可変なら>>780
0793デフォルトの名無しさん2009/09/10(木) 06:01:01
>>779
5文字を2文字ずつとかしたとき余った文字って捨てていいの
0794デフォルトの名無しさん2009/09/10(木) 07:05:14
>>792
/../n の、n オプションって何?調べたけど見つからない

>>793
str.scan(/..?/)
Nが正の整数で可変なら、

r = '.' + ('.?' * (N-1))
str.scan(Regexp.new(r))

でいける?
うーん。正規表現よくわからん。
0795デフォルトの名無しさん2009/09/10(木) 07:05:58
どうなんだろうね
端数出ないと仮定してもよさそうだが

require 'enumerator'
"12345".split(//n).each_slice(2).to_a.map{|a| a.join}

["12", "34", "5"]
0796デフォルトの名無しさん2009/09/10(木) 07:22:47
>>794
> Ruby は日本語化されているので、$KCODE の値に従って正規表現中の日本語文字を正しく扱います。
> $KCODE = "n" の場合、日本語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作です。
> オプションとして n, e, s, u のいずれかを指定することで
> 正規表現の文字コードを $KCODE の値に関係なく個々の正規表現リテラルに指定することもできます。

irb> $KCODE = 'u'
irb> p 'うんこ'.split(//)
["う", "ん", "こ"]
irb> p 'うんこ'.split(//n)
["\343", "\201", "\206", "\343", "\202", "\223", "\343", "\201", "\223"]

文字列が完全にASCIIの範疇しか使われないならぶっちゃけいらない
ASCII 文字の処理だからと n をつけまくってる人は時々見るが、つけないほうがいい時のほうが多いと思うんだ
0797デフォルトの名無しさん2009/09/10(木) 07:28:24
thx
文字コードの指定ですか
1.9以降はどうなるんだろ
0798デフォルトの名無しさん2009/09/10(木) 07:43:01
無指定の場合は対象文字列の encoding と同じだとみなす

irb1.9> p "しふとじす".encode('Shift_JIS').split(//)
["??", "??", "??", "??", "??"]
irb1.9> p "しふとじす".encode('Shift_JIS').split(//).map{|e| e.encode('UTF-8')}
["し", "ふ", "と", "じ", "す"]

split(//n) と同じことをするのはやや手間

irb1.9> p "しふとじす".encode('Shift_JIS').dup.force_encoding('BINARY').split(//)
["\x82", "\xB5", "\x82", "\xD3", "\x82", "\xC6", "\x82", "\xB6", "\x82", "\xB7"]

each_byte の結果を文字列にしたほうがたぶん妥当
あるいはなんか凄い人が凄い簡単な手法見せてくれるかもしれない
0799デフォルトの名無しさん2009/09/10(木) 07:46:43
余った文字も入れたけりゃ
N = 2
'abcde'.scan(Regexp.new('.{1,%d}' % N))
=> ["ab", "cd", "e"]
0800デフォルトの名無しさん2009/09/10(木) 09:44:20
>>772はカスタムマッチャ作ればすぐじゃん、と思ったが
「そのメソッドからの $stdout への出力」というのを限定して取れないことに気づいた
$stdout を曲げてる期間に他の何かからも $stdout に出力があれば混じってしまう

や、「テスト中にはそんなこと起こらない」ということにすればいいんだけども
0801デフォルトの名無しさん2009/09/10(木) 10:03:31
module MyCustomMatchers
class MatcherDisplay
def initialize(expected); @expected = expected; end

def matches?(proc)
old = $stdout.dup; out = StringIO.new
$stdout = out; proc.call; $stdout = old
out.rewind
@actual = out.read
return (@actual == @expected)
end

def failure_message
"expected stdout is #{@expected.inspect} but was #{@actual.inspect}"
end

def negative_failure_message
"stdout #{@expected.inspect} should not be same"
end
end

def display(expected)
MatcherDisplay.new(expected)
end
end

describe "Test" do
include MyCustomMatchers
it "say hello" do
lambda{print "hello!"}.should display('hello!')
end
end
0802デフォルトの名無しさん2009/09/10(木) 10:08:20
あ、$stdout を dup する必要ないや
そのへん適当に
あとメッセージも適当
failure_message が should が失敗したときのメッセージ
negative_failure_message が should_not が失敗したときのメッセージ
モジュール作って include 形式にはしなくても構わないがこうしたほうがきっとあとで楽
0803デフォルトの名無しさん2009/09/10(木) 11:01:01
>>785
>何を言ってるんだおまえは
おまえこそ何を言っているんだ。
Ruby初心者では、782で紹介されたページから、ライブラリのドキュメントまでたどり着けないことがあるという事実がわかったんだから、
初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?

たとえば
ttp://doc.okkez.net/static/188/doc/index.html
のページを見ると、言語仕様の目次がずらーっと並んでいて、ライブラリのドキュメントへのリンクは後ろのほうにあるだけ。
これだと、>>783のような勘違いが生まれても仕方ない。
そうじゃなくて、このページから目次をなくして、
「言語仕様」「組み込みライブラリ」「標準添付ライブラリ」「その他」
の4つの大きなアイコンが並んでいるだけにすれば、>>783のような勘違いもなくなると思うんだけど、どうだろうか。

・・・という感じで、初心者が必要なドキュメントにたどり着けるようにするにはどうしたらいいかを話し合ってほしい。
せっかくの初心者スレだし。
0804デフォルトの名無しさん2009/09/10(木) 11:22:14
>>803
そこはサイトを作ってる奴が○○○ので仕方ないかと。

いいじゃん、ruby-doc.orgの英語ドキュメント充実してるんだから、そこを見れば。
0805デフォルトの名無しさん2009/09/10(木) 11:39:19
> 初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?

こんなチラ裏掲示板で話し合っても全く建設的ではありません。

プロジェクトに提案があるならメーリングリストへ。
0806デフォルトの名無しさん2009/09/10(木) 12:17:33
>>798
unpack("C*").map(&:chr)
0807デフォルトの名無しさん2009/09/10(木) 12:18:13
>>781の時点で見つけられないのはわからないでもない
でも回答があったにも関わらず目に付いた部分しか見ずに探そうとしない>>783ようなのはただのバカだろ
バカの世話までしていたらキリがない
0808デフォルトの名無しさん2009/09/10(木) 12:20:26
each_byteのほうが短かった
0809デフォルトの名無しさん2009/09/10(木) 12:33:10
>>802
テストで標準出力奪うのはやめといたほうが…
テスト自体の出力が混ざるぞ
0810デフォルトの名無しさん2009/09/10(木) 12:43:02
>>809
おう、今まさに混じってるぞ
何が辛いってうっかりメソッド側で p とかしてオブジェクトの中身確かめようとしたら
標準出力に p の結果が混じってテストが失敗すること

warn obj.inspect で逃げてるが display マッチャのコンセプト自体が間違ってたとしか思えん(w
0811デフォルトの名無しさん2009/09/10(木) 13:22:41
>>779
BioRubyを入れるとString#stepが拡張されて
require 'bio'
'abcdef'.step(2){|a| puts a}
ab
cd
ef
とできる。割り切れなければ最後に余りが返ってくる。
まあ、これだけのために使うようなライブラリじゃないし、
マルチバイト文字も使えないけど。
0812デフォルトの名無しさん2009/09/10(木) 14:05:36
>>805
ここだから書き込むやつがいるんじゃないか
わざわざメーリングリストに入って発言なんかするかよ
どうせたいした議論なんかしないんだから。
0813デフォルトの名無しさん2009/09/10(木) 14:11:51
現状このチラ裏でいろいろ書かれているわけだから
それを無視しているメーリングリストの人たちのほうが非建設的
0814デフォルトの名無しさん2009/09/10(木) 14:13:27
>>813
うわぁ
0815デフォルトの名無しさん2009/09/10(木) 14:16:07
本買えばいいじゃんとしか思わない
0816デフォルトの名無しさん2009/09/10(木) 14:25:25
本なんて邪道と思ってるやつもいるからな
おれには理解できんが
0817デフォルトの名無しさん2009/09/10(木) 14:48:21
ri にキャッシュ機能を付加したフロントエンドを被せるとそこそこ快適

refe というリファレンサもあることは知ってるけど使ったことないや。
使ってる人いる? インストールめんどくせ、というイメージなんだが
0818デフォルトの名無しさん2009/09/10(木) 14:54:17
>>817
refe使ってるけど、アーカイブを展開してパス通すだけじゃね?
0819デフォルトの名無しさん2009/09/10(木) 15:42:14
RubyでHTTP caching proxyを作ろうと思うのですが、PerlのHTTP::Proxyに
相当するようなライブラリはないでしょうか?
0820デフォルトの名無しさん2009/09/10(木) 15:51:25
webrickにhttpproxyというのがあるけど、希望に沿えてるかはわからない
0821デフォルトの名無しさん2009/09/10(木) 16:04:16
>>819-820
http://jp.rubyist.net/magazine/?0002-WEBrickProxy
http://doc.okkez.net/static/187/class/WEBrick=3a=3aHTTPProxyServer.html
通信後へのフックしか用意されてないようだから、これを基に手を加える必要がありそう
0822デフォルトの名無しさん2009/09/10(木) 16:23:06
rubyのMLってオナニーメールばかりで気持ち悪い
0823デフォルトの名無しさん2009/09/10(木) 16:43:14
日本語のは、メール自体が少ないから
0824デフォルトの名無しさん2009/09/10(木) 17:39:42
>>772
newgemでbinつき、rspecつきで出力したのが参考になるかも

binのスクリプトのスペックファイルがこんなのになってる
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
require 'tweetswget/cli'

describe Tweetswget::CLI, "execute" do
 before(:each) do
  @stdout_io = StringIO.new
  Tweetswget::CLI.execute(@stdout_io, [])
  @stdout_io.rewind
  @stdout = @stdout_io.read
 end
 
 it "should print default output" do
  @stdout.should =~ /To update this executable/
 end
end
0825デフォルトの名無しさん2009/09/10(木) 17:40:26
あらアプリ名でちゃった。はずかすぃ!
0826デフォルトの名無しさん2009/09/10(木) 17:43:12
>>824
要は出力対象を差し替え可能にしておけってことじゃね

class C
 def initialize(out = $stdout)
  @out = out
 end
 def exec
  @out.print "message"
 end
end
0827デフォルトの名無しさん2009/09/10(木) 17:57:11
どうでもいいけど○○wgetとかwget○○とかってセンスないよね
Wgetクラスとか作っちゃうのもセンスないよね
system("wget #{url}")するよりはマシだけどね
0828デフォルトの名無しさん2009/09/10(木) 18:01:04
ほぼ全員が作ったことがある黒歴史っぽい感じでセンス無くて恥ずかしいよな
OptParserの練習にもなっていいんだぞ、多分
0829デフォルトの名無しさん2009/09/10(木) 18:02:30
センスっていう言葉を使う奴って語彙が乏しいよね
0830デフォルトの名無しさん2009/09/10(木) 18:38:19
open-uri.rbに記述されてる説明なんだけど、誰か訳してもらえませんか。
respond toの意味するところが分かりません。

makes possible to open various resources including URIs.
If the first argument respond to 'open' method,
the method is called with the rest arguments.
0831デフォルトの名無しさん2009/09/10(木) 18:43:05
>>830
http://doc.okkez.net/static/187/method/Object/i/respond_to=3f.html
0832デフォルトの名無しさん2009/09/10(木) 18:50:55
>>831
ありがとうございます!なるほどrespond_toメソッドのことでしたか。
ruby(というかプログラミング)特有の言い回しは慣れないと難しいですね。。
0833デフォルトの名無しさん2009/09/10(木) 18:57:01
下記のような、Item.find(params[:id]).hogehoge という部分だけが違うメソッドがあります。

  def move_lower
   Item.find(params[:id]).move_lower
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end

  def move_higher
   Item.find(params[:id]).move_higher
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end

  def move_to_bottom
   :
  def move_to_top
   :

(うつく)
0834デフォルトの名無しさん2009/09/10(木) 19:01:56
メソッドのことっていうか、組み込みクラスの名前はそれなりに練られているし
ドキュメント書く人もある程度従うから、メソッド一覧が辞書的・用語的に使える場合があるという感じ

というわけだからその部分は「第一引数がopenメソッドに応答するなら」で、いわゆるduck typing
http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
0835デフォルトの名無しさん2009/09/10(木) 19:12:11
(うつき)

DRYしたくて、この場合、どのような書いたものでしょうか?
例えば、以下のような感じにしたいのですが、Item.find(params[:id]).methodのところがうまく行きません (´・ω・`)

  def move_lower
   do_move(:move_lower)
  end
  def move_higher
   do_move(:move_higher)
  end
  def move_to_bottom
   do_move(:move_to_bottom)
  end
  def move_to_top
   do_move(:move_to_top)
  end

  def do_move(method)
   Item.find(params[:id]).method # ←?????
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end
0836デフォルトの名無しさん2009/09/10(木) 19:17:02
>>835
Item.find(params[:id]).__send__(method)
0837デフォルトの名無しさん2009/09/11(金) 00:00:27
あまりDRYに見えない気が。
0838デフォルトの名無しさん2009/09/11(金) 01:08:11
>>836
いけますね

Item.find(params[:id]).send(method)
ではダメなんで書馬、
0839デフォルトの名無しさん2009/09/11(金) 01:20:39
>>838
Object#__send__は原則として書き換えてはいけない
Object#sendは上書きされることが予想(許容)される

http://doc.okkez.net/static/187/class/Object.html
>send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。

じゃあsendはなんで存在するのかというと・・・俺も聞きたいw
0840デフォルトの名無しさん2009/09/11(金) 01:26:07
微妙に書き方間違えた、Object由来の__send__とsendの話
class C
 def send; end # Cの都合に合わせたsendに書き換えてOK
 # def __send__; end # __send__の再定義はマナー的にNG
end

Itemの中身は(ほぼ)間違いなくObject由来のオブジェクトだからsendも__send__も使えるけど
sendが再定義されたクラスの可能性もあるから
Object#sendの機能が使いたいなら__send__のほうが確実ということ
0841デフォルトの名無しさん2009/09/11(金) 02:52:17
ごめんちょっとテスト
-スペース×2
 -全角スペース
 - 
0842デフォルトの名無しさん2009/09/11(金) 03:05:49
失礼しました
nbspな書き込みが多かったから2ch側で自動的に置き換えてくれるようになったのか、
と思ったけど違ったみたいだ
0843デフォルトの名無しさん2009/09/11(金) 05:30:26
send は利用専用
再定義のないプレーンな状態では send が使えてしかるべき
object_id と __id__ の関係に近い

個人的には __class__ もあってしかるべきだったと思うのだが
あんま __ つきメソッド作ると Python ぽく動作しなければならない気分になるかも
0844デフォルトの名無しさん2009/09/11(金) 05:32:33
>>842
navi2ch は文頭から始まるスペースを   に書き換える
本来はやってはいけないことなんだがまあそれはそれで
0845デフォルトの名無しさん2009/09/11(金) 05:35:48
目茶初心者的な質問です。

RubyのThreadでの引数の役割りって、何ですか?
(どういう場面で役立つのか分からない)

関数なら y = f(x) で引数xを元にyが決定されプロット
できますが、Threadも左右されるのでしょうか?

すいません、ググっても分かりませんでした。
0846デフォルトの名無しさん2009/09/11(金) 06:19:04
引数なんだからルーチン実行に必要な明示的外部因子だろ
という話ではなさそうだな

Thread.new の引数の話なら、これはそのまんまだ
説明読んで実際に動かしてみてわからんのなら、きっとまだ早い
1ヵ月後くらいに再読すると結構わかるので今は諦めれ
08478332009/09/11(金) 06:34:05
>>836-843
ありがとうございます。
本当だ、Railsだとsend上書きしてたりしますね。

ちょっとした使い分けですね。上書きされるような挙動を許したければsend、
そうでないなら、__send__

使ってみます。ありがとうございました。
0848デフォルトの名無しさん2009/09/11(金) 06:44:42
メッセンジャー機能として上書きするために残ってるんじゃないぞ

「送る」メソッドとして名称が被ってもいいように __send__ がある
たとえばメール用ライブラリでは送信用のメソッドがどう考えても send になるが、
そういうクラスで send を作っても元の send の機能が失われないように __send__ がある
他の Object のメソッドはまあ上書きで消えちゃっても仕方ないかなあと思えるものが多いが、
send の機能だけは特別
この機能が使えない状態のクラスは Ruby としてヤバい
0849デフォルトの名無しさん2009/09/11(金) 06:56:46
>>844
インライン要素に囲まれた空白文字は空白として保存する、みたいな仕様になっていれば
今ごろ世界中ハッピーだったと思うんだ
0850デフォルトの名無しさん2009/09/11(金) 09:10:15
>>847-848
RailsだけじゃなくてSocket#sendなんてのもあるしな
08518332009/09/11(金) 09:34:56
>>850
あー、ほんとうだ。
Railsのsend(ActiveRecord)と、Socket#sendは全然意図が違いますね。

前者はフックして処理追加みたいな感じですが(superよんでるし)、
後者は、__send__関係ねえw
上の方で教えていただいた事柄は、後者のことですね、たぶん。

別の意味のsendが定義されてる場合、__send__よべと。そりゃそうだ。
Railsの場合は、むしろ、sendとしてsendが呼ばれるのを期待しているみたいなので、
__send__直接でなく、sendを呼んでやらないととおかしなことになりますね。
0852デフォルトの名無しさん2009/09/11(金) 09:39:13
ソケットにrecvとsendがなかったらアルェーってなるだろう
0853デフォルトの名無しさん2009/09/11(金) 11:26:06
class クラスのインスタンスを「足し算」することはできませんか?

bar = Foo::Bar.new
baz = (bar.class + Class.new('Baz')).new
p baz.class #=> Foo::Bar::Baz

eval するしかないとしたら、なにかより安全な方法はありますか?
0854デフォルトの名無しさん2009/09/11(金) 11:43:37
何がしたいかわからん。
Foo::Barのスコープ下に可変な名前の新クラスを定義したいという意味?
0855デフォルトの名無しさん2009/09/11(金) 11:47:59
>>853
できね
文字列としてクラス名を適当に作ってからevalしろ
定数になる書式しか受け取らないevalはあれば楽しいが多分無い
0856デフォルトの名無しさん2009/09/11(金) 11:49:54
>>854の意味なら
new_class_name = 'Baz'
Foo::Bar.const_set(new_class_name, Class.new)
0857デフォルトの名無しさん2009/09/11(金) 15:36:36
ドキュメント表記でFoo::Hogeと書かれている場合のFooとHogeの関係は、

○HogeはFooの内部クラス
○HogeはFooの内部モジュール
○HogeはFooで定義された定数

のいずれかと思っていれば間違いないでしょうか?
ドキュメントを見て自分で調べた限りではこのような使われ方がされているようです。
継承したクラスや、インクルードしたモジュールなどは、Hoge::Fooのような書き方をしていないようなのですが、継承・インクルード用の表記法はあるのでしょうか?
0858デフォルトの名無しさん2009/09/11(金) 15:42:06
意味的にはそれであってる、実装的には三つ目に集約される
というのもクラスもモジュールも、ClassインスタンスやModuleインスタンスが定数に代入されているだけに過ぎないから

継承はC < Object
モジュールにお約束はないと思うけど、リファレンスでは継承と同じように書いてるね
C < Enumerable < Object
08598452009/09/11(金) 15:50:03
>>846
レスどうも。
理解の助けになるようなサンプルがググっても見つかりません。
(手元の本のサンプルはやたら行数が多いし)

適当なサンプルコードってありますか?
08608572009/09/11(金) 15:52:25
>>858
ありがとうございます。すっきりしました。
モジュールのインクルードもHoge::Moduleと書きたくなっちゃうけど違うんですね。
公式HP見たら、ご指摘どおり、Array < Enumerable < Object < Kernelとなってました。
Java厨の自分にはObject < Kernelはとっても違和感がw
0861デフォルトの名無しさん2009/09/11(金) 15:56:46
>>859
x = 1; t = Thread.new(x){ sleep 1; p x }; x += 1; t.join #=> 2
x = 1; t = Thread.new(x){|y| sleep 1; p y }; x += 1; t.join #=> 1
こういう話?
0862デフォルトの名無しさん2009/09/11(金) 15:58:14
一個目まちがえた
x = 1; t = Thread.new{ sleep 1; p x }; x += 1; t.join #=> 2
■ このスレッドは過去ログ倉庫に格納されています