[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 20:58 / Filesize : 271 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 17



1 名前:デフォルトの名無しさん [2008/01/16(水) 17:41:27 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2-7あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。

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

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

477 名前:デフォルトの名無しさん [2008/02/02(土) 03:02:51 ]
windowsのコマンドプロンプトのコマンドラインで「|」を使えないから、one linerでブロックで変数を受け取る構文が書けないよ。
どうすればいいの?

478 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 03:21:41 ]
>>477
普通に書けるけど?
> ruby -Ks -e "Dir.glob('*'){|x|p x}"

479 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 08:06:42 ]
^でエスケープ
> ruby -Ks -e "Dir.glob('*'){^|x^|p x}"


480 名前:86 mailto:sage [2008/02/02(土) 10:00:40 ]
>>459
ありがとうございます。zipに関してかなり理解できました。
けっこー使えそうなメソッドなのでばりばり使っていきます。

481 名前:デフォルトの名無しさん [2008/02/02(土) 10:04:11 ]
>>478
>>479
せんくす

482 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:43:33 ]
ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。
しかし、「データがありません」という場合どうするかで悩んでます。

a) 空のハッシュ {} を返す
b) 偽である nil を返す
c) 自作の例外を発生させる

どれが妥当でしょか。
このハッシュは別の大きなハッシュに {サイト名 => parsed_hash} のように格納される予定です。
データがありませんの大きな理由として
「過去のハッシュとの差分がゼロ」
「HTML中にパースすべき該当項目なし」
「そもそもサーバにアクセスできない」
等があります。

483 名前:デフォルトの名無しさん [2008/02/02(土) 14:05:59 ]
erbについて質問があります。
下記のようなコードを書いてerbに変数ItemListの内容を出力しようと思います。
PHPのテンプレートエンジンのSmartyのようにassignメソッドがあればいいのですが
どうも見当たりません。
変数のスコープの問題だと思うのですが、どうやって出力すればいいのでしょうか?

def initialize
@cgi=CGI.new
end

# 商品一覧
def doItemList
@erb = ERB.new("item_list.tpl")
im=ItemManager.new()
itemList=im.getItemList(10)
display()
end

# テンプレート出力
def display(contentType="text/html")
print "Content-Type: #{contentType}\n\n"
print @erb.result(binding)
end


484 名前:デフォルトの名無しさん [2008/02/02(土) 14:49:15 ]
Rubyが面白そうなので今日からRubyをはじめます(^-^)
まずはダウンロードしてこなきゃ!!o(^-^)o

485 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:54:20 ]
>>460
俺がよく書くのは

> ruby -e "puts ENV['PATH'].split(';')"(sortを加えることも)

だって、生のPATH記述って読み辛いんだもの…。



486 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:00:05 ]
>>459
なんだかすごく助けられた気がする
深謝

487 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:09:33 ]
>>483
erbを一度も使ったことのない俺がWeb上の解説を読んで適当に回答するよ!
> in `display': undefined local variable or method `itemList' for #<MyCGI:0x4030ed9c> (NameError)
こんなエラーが出るという質問だと推測。itemListをインスタンス変数あたりに書き変えると動いたよ!

require 'erb'
class MyCGI
def doItemList
im = ItemManager.new
@itemList = im.getItemList(10)
@erb = ERB.new(DATA.read)
display
end
def display(contentType="text/html")
@contentType = contentType
@erb.run(binding)
end
end

class ItemManager
def getItemList(n); (1..n).to_a; end
end

MyCGI.new.doItemList
__END__
Content-Type: <%= @contentType+"\n\n" %>
<%= @itemList.join(',') %>

488 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:17:35 ]
@erb.runあるいは@erb.resultをするメソッドから
erbスクリプト内で使ってる名前の変数が読めないとダメっぽいという話。たぶん。
だからこれでも動く。displayに引数があるのは気持ち悪いのでoutputに変更(というかdisplayはto_sの以下略)

require 'erb'
class MyCGI
def doItemList
im=ItemManager.new
itemList=im.getItemList(10)
@erb = ERB.new(DATA.read)
output(itemList)
end
def output(itemList, contentType='text/html')
@erb.run(binding)
end
end

class ItemManager
def getItemList(n); (1..n).to_a; end
end

MyCGI.new.doItemList
__END__
Content-Type: <%= contentType+"\n\n" %>
<%= itemList.join(',') %>

489 名前:デフォルトの名無しさん [2008/02/02(土) 15:17:35 ]
>>487
レスどうもです。
やっぱり、スコープの問題なんですね。
MyCGIのインスタンス変数にしてしまうってのが・・・
なんか書き方として気持ち悪いような。

itemListのまま使いたいとすれば、def doItemListの中でerbを使うしかないって事ですかね?
やっぱり、assign欲しい・・・

490 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:54:52 ]
assignだと何か便利なんですかね
あとerb使うときはERB::Utilでエスケープするようにしてくれえ

491 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:42:55 ]
bindingはただの関数的メソッドなので、変数に入れてdisplayに渡せばいい
ただ、bindingしたあとにローカル変数を「追加」するのは面倒なので注意
この場合、display内でcontentTypeを設定してitem_list.tplで使用するのは面倒

# item_list.tpl
<%=h itemList.map{|e| "<#{e}>"}.join(' ') %>

# out.rb
require 'erb'
class MyCGI
include ERB::Util
def doItemList
@erb = ERB.new(File.open("item_list.tpl").read)
im=ItemManager.new()
itemList=im.getItemList(10)
binding_data = binding
display(binding_data)
end
def display(binding_data,contentType='text/html')
print "Content-Type: #{contentType}\n\n"
print @erb.result(binding_data)
end
end

class ItemManager
def getItemList(n) ['あ','い','う','え','お']; end
end

MyCGI.new.doItemList

492 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:14:24 ]
>>482
ハッシュを加工するなら空のハッシュを返すかも
HTMLから抜き出すならnilでいいんじゃね

493 名前:デフォルトの名無しさん [2008/02/02(土) 17:30:02 ]
>>490
assignあると明示的にこれ使いますよってできるから、わかりやすいんですよ。個人的には。
Railsだと、erbのスコープはどうなってるんでしょう?

494 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:48:35 ]
引数バージョンをことごとく無視してるのは何か理由があるのか
いっそのことPHPで書けば?

495 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:35:17 ]
引数バージョンって何?



496 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:41:33 ]
bindingをdisplayの引数にすれば? ということじゃないの?


497 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:43:30 ]
>>482
>ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。
>しかし、「データがありません」という場合どうするかで悩んでます。
>
>a) 空のハッシュ {} を返す
>b) 偽である nil を返す
>c) 自作の例外を発生させる

「データがありません」を表すなら、b) がよい。
a) は、データがない場合とある場合とを同じように扱いたい場合に採用する設計。
c) はやりすぎ。

ただ、b)とa)はそう大差がない。


498 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:55:28 ]
>>489
>やっぱり、assign欲しい・・・
あんま関係ないけど、Erubisだとできるみたい。assignじゃなくてHashつかうんだけど。
def doItemList
  @eruby = Erubis::Eruby.new(DATA.read)
  itemList = ItemManager.new.getItemList(10)
  output(:itemList=>itemList)
end
def output(hash)
  print @eruby.evaluate(hash)
end

>>490
>あとerb使うときはERB::Utilでエスケープするようにしてくれえ
これもErubis::EscapedEruby使うとデフォルトでエスケープされる。


499 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:23:12 ]
>>496
>>488もじゃね?

表示したいデータをローカル変数にした状態でrunするので問題ないと思うんだけどなあ
変数の参照を全部持ってくbindingがイヤなんだろ、つまり

500 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:26:23 ]
>>499
*.rhtmlでローカル変数を変更したら、それがもとのプログラムにも影響与えるじゃん。問題ありだろ。

501 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:48:21 ]
require 'erb'
def main
include ERB::Util
erb = ERB.new(DATA.read)
str = 'strは文字列だよ!'
puts str
message = 'こんにちは'
print erb.result(binding)
puts str
end
main
__END__
<%=h message %>
<% str='strが変更されました' %>

=============================
~$ ruby erb.rb
strは文字列だよ!
こんにちは

strが変更されました
~$

ぬう

502 名前:デフォルトの名無しさん [2008/02/02(土) 20:59:25 ]
ページキャッシュ機能持ってるRubyのテンプレートエンジンってないの?

503 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:12:24 ]
>>500-501
require 'erb'
class MyCGI
def main
str = 'default'
p str
msg1 = 'Hello'; msg2 = 'World'
output(msg1, msg2)
p str
end
def output(msg1, msg2)
erb = ERB.new(DATA.read)
erb.run(binding)
end
end
MyCGI.new.main
__END__
<%= "#{msg1},#{msg2}!" %>
<% str='**CHANGED**' %>

- - - 8< - - - 8< - - - 8< - - - 8< - - - 8< - - -

$ ./test.rb
"default"
Hello,World!

"default"

504 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:33:11 ]
そんなに気になるならErb.newしてrunするクラスを別途作れば?

っていうのがきっとErubisなんだろうな…

505 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:38:29 ]
>>502
出力結果のHTMLをキャッシュするという話なら、それはテンプレートエンジンとは別に用意する機能だよ。
テンプレートエンジンに持たせる機能じゃない。



506 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:56:08 ]
>>505
つSmarty

507 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:17:06 ]
素のERBには無理だろうね
そこまでは気を遣ってないというかそれは自力でやれというか

…Erubisにはあるようなことが書いてあるなあ
ttp://www.kuwata-lab.com/erubis/users-guide.06.html#topics-caching

508 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:35:37 ]
Erubisは高速なERBとして、開発されてて、
その高速化の手段の一つとして、キャッシュすることも挙げてたからな。

Preprocessing 何つー機能もあるくらいだし

509 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:38:54 ]
別にERBは遅くないけどね

510 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:08:48 ]
プログラムの中から、コンソール出力に行くはずのテキストオブジェクトを奪ってファイルに出力したいんだけど。。

より具体的にはTest::Unitを使いたいんだが、そのログをファイルにしたい。
ぱっとリファレンスを読んだ限りじゃそういう類の見つからないし、なんかいい方法ないですか。

もし複数いい方法があれば、それぞれの違いについて簡単な解説つきだととても助かる。

511 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:10:55 ]
ruby unko.rb > benki.txt

512 名前:デフォルトの名無しさん [2008/02/03(日) 02:21:20 ]
はじめまして、ネットワークの初歩のコードを書いてみたのですが

def checkSite( address )
url = URI.parse(address)
res = Net::HTTP.start(url.host, url.port){|http|
http.head(url.path)
}

# HTTP_OKなら
if res.code == 200 then
p res['content-type']
else
p res['content-type']
puts "error : " + res.code.to_s
end
end

実行結果が

"text/html;charset=UTF-8"
error : 200

になります
res.code == 200なのにifでうまくひっかかりません
これは何を勘違いしているのかご指摘お願いしますm(__)m

513 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:25:00 ]
"200"

514 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:27:07 ]
>>512
こういうのは自分で実際にデータを表示して試行錯誤

require 'uri'
require 'net/http'

url = URI.parse('www.2ch.net/')
res = Net::HTTP.start(url.host, url.port){|http|
http.head(url.path)
}
p res.code


の実行結果

$ ./http.rb
"200"

つまりはそういうこと

515 名前:デフォルトの名無しさん [2008/02/03(日) 02:29:21 ]
if res.code == '200' then

ならOK



516 名前:デフォルトの名無しさん [2008/02/03(日) 02:31:10 ]
>>513
>>514
>>515
さっそくのお返事ありがとうございます、解決しました
res.codeは数値だと思い込んでいて(.to_sできるし)ハマっていました

517 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:46:58 ]
'200'と書くよりはわかりやすい(かも)

require 'net/http'
Net::HTTP.version_1_2
uri = URI.parse('www.2ch.net/')
res = Net::HTTP.start(uri.host, uri.port){|http|
http.head(uri.path)
}
if res.code_type == Net::HTTPOK
p res
end


518 名前:510 mailto:sage [2008/02/03(日) 03:16:21 ]
>>511

519 名前:510 mailto:sage [2008/02/03(日) 03:16:48 ]
すまん…
>>511

520 名前:510 mailto:sage [2008/02/03(日) 03:21:00 ]
すまん、二回も立て続けに書きかけで書き込んでしまった
>>511
えと、それが出来るのならそうしたんだ。

ただ、残念ながら、telnetが禁止されてるレンタルサーバー上で、念のためモジュールテストを行いたくて、
そいでそういうニーズが出てきてるんだよ。

だから、そうやってコマンドラインでリダイレクトできれば楽なんだけど、コマンドラインそのものが扱えないというわけ。

まぁもっとも、UnixもRubyも初心者なので、その回答で正しいのなら…もう少し説明してくれると助かる。

521 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:25:56 ]
#!/usr/bin/ruby
system("ruby unko.rb > benki.txt")

522 名前:510 mailto:sage [2008/02/03(日) 03:34:55 ]
当たり前でシンプル。
ありがとう。なるほど。
後は必要に応じて加工し放題だな。

523 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:39:09 ]
Ruby的には出力先をねじ曲げるのが妥当

$stdout=File.open('output.txt','w')
$stderr=File.open('errors.txt','w')
puts 'テストだよん'
raise 'エラーだよん'

これ以降、puts や print の標準出力は$stdoutで指定したoutput.txtに、
例外とかのエラー出力は$stderrで指定したerrors.txtに書き込まれる

が、これは意外とめんどいんで、シェルのリダイレクト代わりに使うなら>>521で十二分かと

524 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:41:42 ]
>>521 だとフォームとかの情報が伝わらないんじゃないかな?
標準入力の情報を渡す必要がありそう。

525 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:45:40 ]
ユニットテストならフォームの情報は不要で
自分でデータ渡してるだろうから多分問題ないだろう。



526 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 04:28:14 ]
>ただ、残念ながら、telnetが禁止されてるレンタルサーバー上で、念のためモジュールテストを行いたくて、

いまどきtelnetなんてどこでも禁止されてるだろ


527 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 04:31:17 ]
ターミナル経由のログインのことだと解釈したけど
ファミコンとかゼロックスとかと同じような感じ

528 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:29:46 ]
今時、telnetといって文字通り捉えるのははずかしいぞ

529 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 06:18:09 ]
今時telnetがデフォで入ってるのはWindowsとOSXくらいのもんだろw

530 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:46:24 ]
普通は「shellの利用が禁止されてる」っつー罠

531 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:17:56 ]
>>529
デーモンはともかく、クライアントとしてのtelnetはPOPやHTTPみたいな
プロトコルを手で喋る(?)ときに重宝するから入っていそうだが。

とはいえ、デフォでは入ってないかもな。


532 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:37:16 ]
本の感想サイトから書名とレビューを抜き出して表示するプログラムを作るとします。
表示は「とにかく一覧として表示されればいい(新着が存在することを明示しなくていい)」とします。

昨日抽出したとある本のデータのハッシュは以下の通りでした。PStoreで保存します。
book = {'title'=>書籍名, '著者'=>著者名, 'review'=>['面白かった。','まあまあだと思った。']}
で、今日アクセスしてHTMLをスキャンした結果が
today = {'title'=>書籍名, '著者'=>著者名, 'review'=>['面白かった。','まあまあだと思った。']}
という、昨日と中身同じな未更新の内容でした。相手のHTMLには最終更新日などの情報はありません。

1) ハッシュの上書きの特徴を利用し、強制的にbook.update(today)してbookを今日の結果として表示させる
2) reviewの中身を比較して違いがあった場合のみbook.update(today)とかしてbookを表示する

2通りの手段があると思うんですが、2ってもしかして比較に時間かかったりしますか。
プログラム的には「差分が存在した場合のみ変数を更新」というのがいいような気はするんですが。
サイトから抜き出した要素がある日突然減ってることはありません(今日はtitleが無いとか)。

533 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:51:42 ]
>>532
データの量にもよるけど、単純な比較に致命的な時間がかかる事はあまり無いと思う。
その前提なら変化があるのは review の項目だけだろうから、これだけでいいのでは?

today['review'] == yesterday['review']

534 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:56:59 ]
>>532
いきなり全体に上書きしてもデータ上は問題ないのなら1でいいんでないかい
つまり「過去ログは不要で今日のサイトの状況のみをリアルに反映する」のが目的ならね

ある日のレビューが
'review'=>['面白かった。','まあまあだと思った。','↑厨の連投自演乙wwww']
になってて、翌日に
'review'=>['面白かった。','まあまあだと思った。']
に戻ってた場合とかは、1の方法だとレビュー削除を検知も保存もできないけど、2ならやろうと思えばできる

535 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:02:23 ]
Hash#updateは機械的にキー捜して値を更新してるだけだよね?
>>533のように変化しうるキーの値だけ更新するのが本当なんだろうけど、
100項目くらいなら全部をupdateしちゃって問題ないと思う



536 名前:デフォルトの名無しさん [2008/02/03(日) 19:45:26 ]
Rakefileでtaskが失敗したことを表現するにはどうしたらよいでしょうか?
test taskが成功したときのみinstall taskを実行して欲しいです
exitで終了させる方法しか思いつきません

task :default => [:install]

task :test => OUT do |t|
 %x{ #{Dir.pwd + '/' + t.preqs[0]} }
 if $? != 0
  print "sippai\n"
  #exit(1)
 end
end

task :install => :test do |t|
 print "install...\n"
end

537 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:52:19 ]
raise でメッセージつけるとか

538 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:26:55 ]
中途半端に自作のデータ格納クラス作るよりも、
適当なでかいハッシュにキーと値のペアで格納したほうがマシだよね?

539 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:31:22 ]
Structってのもあるよ。


540 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:36:25 ]
> Struct
> 構造体クラス。
> Struct.new はこのクラスのサブクラスを新たに生成します。
> 個々の構造体はサブクラスから new を使って生成します。
> 個々の構造体サブクラスでは構造体のメンバに対するアクセスメソッドが定義されています。

…ハッシュでいいや

541 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:37:03 ]
俺はモジュール1〜2つ作って、その中にクラス作りまくる派。
・後でメソッド持たせたくなった時、楽
・項目名を間違っていた場合すぐ判る
・その一連のデータにどんな項目があるかが一目瞭然

542 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:49:19 ]
データクラスを設定するためだけにインスタンス変数をいちいち30こくらい作るの面倒なので中身はただのHashです
Hashでkeyを指定するのとaccessorでインスタンス変数にアクセスするのってたいして変わらん気がする
もっと複雑怪奇なデータ構造なら破綻するのかもしれないけど

あとただのデータの癖にメソッドたくさん持ってるのは気持ち悪い
おまえらは素直にアプリケーションクラスにいじられてればいいんだよ

543 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:02:19 ]
ネットからデータをげっとぉするメソッド内で、アクセス間隔intervalを設定したいです。

# その1 -----------------------------
interval = nil
interval = 10 if 適当な条件

sleep interval if interval
# その2 -----------------------------
if 適当な条件 then
interval = 10
else
interval = nil
end

sleep interval if interval
# その3 -----------------------------
interval = 10 if 適当な条件

sleep interval if defined?(interval)
# -----------------------------------

どれがいいかな?
intervalはここでしか使わないんですが。
今までは何の疑いもなくインスタンス変数を消費して
sleep @interval if @interval
とか書いてたんですがこれを機にインスタンス変数の乱用減らそうかと

544 名前:デフォルトの名無しさん [2008/02/04(月) 02:04:31 ]
"あいうえお"[2]で"う"が出ないのって、アホなの?

545 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:30:29 ]
その問いへの答えは
"abcde"[2]が"a"がでないのをどう受け止めるかによって変わりそう。




546 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:07:12 ]
>>543
こーゆーのは?
interval = ( 適当な条件 ? 10 : 0 )
:
sleep(interval)

ローカル変数で間に合うくらい近い場所ならこーするけど
sleep(10) if 適当な条件

547 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 09:06:08 ]
>>545
卑近実際の使い勝手が悪いのには反論の余地はないな
いちいちアスキー文字に変換されないのは便利なこともあるんだろうが

>>543
ローカル変数の初期値のスタンスに関する問題だということでいいよな
その2かそれに類するものであるべきだとは思う
その1のようにnilを指定したあとで別オブジェクトに挿げ替えるというのは気持ち悪い
あと、その3は常にtrueになるような気がしてならんのだが

548 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:01:44 ]
驚き最小の原理的に望ましくないし、使い勝手も悪いっつーたら何の利点があるんだろ

549 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:18:20 ]
一応、Stringはバイト列であるという考え方らしい

だったらString.eachはString.each_lineではなくString.each_byteと同じものにしとけバーカバーカ

>>544
$KCODE='e'
puts 'あいうえお'[4,2]

"う"


550 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:31:02 ]
>>548
驚き最小の原理というのは(Matzの)驚きが最小って意味。
Cでも"abcdef"[0]は"a"じゃないじゃん。ブロック変数がローカルでないのも
Cの
int i = 42;
for (i = 0; i < 100; i++) {
process();
}
i => 99
って動作を踏まえたものだし、それなりに根拠はある。

1.9だと両方とも変わったんだけど、?aという記法は残して欲しかったな。


551 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:46:47 ]
>>550
記法自体は残ってるよ。挙動を変えないでほしかった、という意味かな。

552 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:52:31 ]
Perlでは文字列の4番目って何になるんだっけ、と思ったが
どう書いていいのか全く思いつかなくなっててとてもショック
そんなにまじめに勉強してたわけじゃないけどさー

いかん、これでは「Rubyしか使えない可哀想な人」になってしまう

553 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:00:27 ]
>>551
Yes。Emacsの記法だっけか。

>>552
RubyはPerlの互換だから、RubyのほかにPerlだけ使えてもあんまり意味ないけど


そういや最近話題のarcでは("abcdef" 0)が#\aなんだよな。

554 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:30:03 ]
/home/me/ruby
というディレクトリに
main.rb
sub.rb
uri.rb
という3つのファイルがあって、main.rbからsub.rbとuri.rbを読み込んで中のクラスやモジュールを利用したいです。
一番好ましい書き方は何ですか?
main.rbの実行時のカレントディレクトリは/home/me/rubyだけとは限りません。

555 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:55:42 ]
$: << File.dirname(__FILE__)



556 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:57:08 ]
>>542
30ってヤケにでかい塊だな。

557 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:02:59 ]
>>555
__FILE__はフルパスとは限らないので
$: << File.expand_path("..", __FILE__)
のほうがいい。


558 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:17:24 ]
いやこれは意図的な罠だろ

> cat uri.rb
class URI
MSG="このファイルは#{__FILE__}です"
end
> cat main.rb
$LOAD_PATH << File.expand_path("..", __FILE__)
require 'uri'
puts URI::MSG
> ruby ./main.rb
main.rb:3: uninitialized constant URI::MSG (NameError)

横着せずに require をフルパスつきで読み込んだほうが確実だと思う


559 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:28:41 ]
q = abcd
q.length × 1.5 =>8
てしたいのですが、うまいことぐぐれないので助けてください。

560 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:35:40 ]
>>559
ぐぐる以前に体系的に一通りRubyの基礎を学ぶといいぞ

561 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:43:43 ]
何がしたいのかもっと具体的に。

562 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:46:08 ]
>>558
$LOAD_PATH.unshift(File.expand_path("..", __FILE__))


563 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:47:22 ]
>>561
いや、意味は不明だがとりあえずは比較だろ

q = 'abcd'
if (q.length * 1.5 >= 8.0) then
puts 'とりあえず8かそれ以上です(何が?)'
else
puts 'とりあえず8未満です(何が?)'
end



564 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:49:44 ]
>>562
それだと添付ライブラリの uri を require 'uri' で読めなくならないか
自作ファイルのほうを特別扱いするのが妥当かと思われ

565 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:52:57 ]
ああ、-rubygemsなんか使ってたりで、すでに標準ライブラリのuri.rb読んでるとダメなのか
パスが変わってないと読み込んでくれないってことか



566 名前:デフォルトの名無しさん [2008/02/04(月) 16:30:37 ]
これだから、Rubyは・・・

567 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 16:32:09 ]
言語仕様自体の是非は隔離スレでやれと

568 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 16:42:17 ]
普段数十行の処理用にperl使ってる程度ですが、そういう人間にもruby使う意味ってありますか?

569 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 16:44:49 ]
Perlでの記述に速度以外の不満があるのなら

とらえず、既存の仕事をRubyで置き換える意味はないよ

570 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 16:45:26 ]
Rubyの字面が好きなら乗り換える価値はあるかもな。
自分も1000行行った事ないけど字面が好きだから細々と使ってるよ。
正直細かい機能はほとんどしらねぇw

571 名前:568 mailto:sage [2008/02/04(月) 16:51:22 ]
いえ、perlに不満があるわけではないです。
単にruby流行ってるみたいなんで興味持った、っていう程度です。スンマセン

でもちょっとかじってみようかな。perlからの乗り換えも結構多いようですね

572 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:02:29 ]
Perlの人が飯を賭けずに家で遊んでみるぶんには大変魅力的な言語でございますよ
一通り使ってみた後にはPerlでのプログラミングの筋もよくなってるという矯正効果つき

573 名前:559 mailto:sage [2008/02/04(月) 19:39:05 ]
算数ができてませんでした。
4文字を入れて出力したいのは6ってゆー数字です。

574 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 20:00:09 ]
>>573
体系的に一通りRubyの基礎を学ぶといいぞ

575 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 20:03:24 ]
Rubyの基礎って言うか
どんなプログラム言語でもExcelとかでも
「かける」は*で「わる」は/とか
プログラム以前の問題かもな



576 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 20:05:20 ]
"abcd".length * 1.5
=> 6.0

577 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 20:11:19 ]
>>575
いや四則演算の記号はRubyの基礎だろ

>>576
要件満たしてないぞ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<271KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef