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 要件満たしてないぞ