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

Ruby 初心者スレッド Part 40

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

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0237デフォルトの名無しさん2010/12/20(月) 10:30:33
>>236
あ、そうなんだ
無知でスマソ
0238デフォルトの名無しさん2010/12/20(月) 10:32:55
ついでに質問だけど、1.9.1が安定版なら、1.9.2は開発版? で1.9.3が安定版?
0239デフォルトの名無しさん2010/12/20(月) 10:41:21
>>6の通りなんだが、そういや命名規則の話が抜けてるな
1.9 系列の開発版は常に1.9.0を名乗り、バージョンが「上がる」ことはない
1.9 系列の安定版は 1.9.1、1.9.2、1.9.3、… 1.9.10、1.9.11、…を名乗る
1.8 系列の開発版は…あるんだっけ? まあいいや、1.8.7 の次の安定版は、あるとしたら 1.8.8 だ

2.0 が安易に出ることはしばらくない
1.9 の安定版でもう何も足すことも引くこともないというような安定っぷりになったら、
それがそのまま2.0にスライドすると予測されてる
0240デフォルトの名無しさん2010/12/20(月) 11:00:00
1.9.1/1.9.2がお勧めになってないのは
・ それはRubyの書き方のミスです
・ それはRubyの使い方がまずいです
・ それはgemライブラリ側の不具合です
・ それはgemライブラリが1.9.1に対応してないからです
・ それはあなたの文字エンコーディングの扱い方のミスです
が渾然一体となってジェットストリームアタックかけてくるからだな

1.8.7でRubyに慣れてからだと
> それはRubyの書き方のミスです
> それはRubyの使い方がまずいです
が激減して
> それはgemライブラリが1.9.1に対応してないからです
の自力バイパスが可能で
> それはgemライブラリ側の不具合です
を自力修復可能(なことがある)なので、残りの
> それはあなたの文字エンコーディングの扱い方のミスです
とせいぜい
・ それは1.9.1/1.9.2の新機能です
くらいで悩む程度になって気楽
0241デフォルトの名無しさん2010/12/20(月) 11:08:04
いつの話だよw2年前か?
0242デフォルトの名無しさん2010/12/20(月) 11:12:31
日常的に1.9.1や1.9.2を使って「いろいろな」gemを扱ってれば
わりとピキッと来ることが多いはずなんだけど
0243デフォルトの名無しさん2010/12/20(月) 11:18:24
日常的に使ってるが今やそんなことはほとんどないなあ
例えばどんなgemか3つ4つ挙げてみてよ
0244デフォルトの名無しさん2010/12/20(月) 12:02:01
そういや最近の新しいのはないな
文字エンコーディングが変なのは時々ひっかかるけど
0245デフォルトの名無しさん2010/12/20(月) 12:20:32
なんだかんだいってrailsだよりだからいまさら
0246デフォルトの名無しさん2010/12/20(月) 12:26:33
ライブラリの更新履歴見ると「1.9関連かよ!」と思うことはないでもない
0247デフォルトの名無しさん2010/12/20(月) 12:32:00
#!/usr/bin/ruby -Ku
# -*- encoding: UTF-8 -*-
require 'rubygems'
require 'active_support'
require 'date'
p Date::today
p Date::today.last_month

このスクリプトで,test.rb:10: undefined method `last_month' for #<Date: 4911101/2,0,2299161> (NoMethodError)
のエラーが出てしまいます。
対処法知ってますか?

環境は,intel iMac 10.6.5
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]

ruby 1.8.6 (2009-06-08 patchlevel 369) [universal-darwin9.0]のppc miniでは問題なかったのですが。
0248デフォルトの名無しさん2010/12/20(月) 13:24:57
動かないほう、Rails 3が入っていないか?
last_monthのかわりにprev_monthを使用すべし。
0249デフォルトの名無しさん2010/12/20(月) 14:11:42
>>239
rubyのバージョンの数字が2桁にならない保証ってもう過去の話?
0250デフォルトの名無しさん2010/12/20(月) 17:39:07
日常的に使ってない初心者な俺は
amazon-ecs(+Hprocit)で >>240 みたいな目にあった
0251デフォルトの名無しさん2010/12/20(月) 20:03:32
class Foo
 def << name, price
  puts "#{name}=#{price}"
 end
end

foo = Foo.new
foo << "smile", 100

エラーが出ます。なぜですか?
./main.rb:10: syntax error, unexpected ',', expecting $end

0252デフォルトの名無しさん2010/12/20(月) 20:20:37
説明不足なので補足。
foo << ["smile", 100]
foo.<< "smile", 100
という書き方をするメソッド定義はわかるのですが、
foo << "smile", 100
という書き方をするためのメソッド定義が分かりません。

0253デフォルトの名無しさん2010/12/20(月) 20:27:27
<<とか一部のメソッド名は2項演算子の形式をとるから。
02542512010/12/20(月) 21:06:25
何とかなりませんか?
メニューに"smile"、100円を足す正しいメソッドは
mac.menu << "smile", 100
だと思うのですが、どう考えてもこの表記では書けません。
0255デフォルトの名無しさん2010/12/20(月) 21:16:54
構文の問題なので、なんともなりません。
0256デフォルトの名無しさん2010/12/20(月) 21:57:37
へー、こんな制限があるんだ
知らなかった
0257デフォルトの名無しさん2010/12/21(火) 00:16:43
DSLにかぶれると

menu :mac do
item 'smile', 100
item 'potato', 50
end

とか書いてしまいそうだ。
0258デフォルトの名無しさん2010/12/21(火) 03:24:25
PostgreSQLを使おうとpgを使っているのですが、SELECT ary FROM tableの結果
aryだけを配列としたいのですが、昔はPGResult.resultっていうのがあったみたいなんですが
今はないみたいで PGResult.each do ふにゃらら endでやっているのですが、
これで正しいのでしょうか? なにか釈然としません。
0259デフォルトの名無しさん2010/12/21(火) 03:32:43
ふが
ふが
ふが
0260デフォルトの名無しさん2010/12/21(火) 06:26:53
>>254
すでに回答があるように、言語使用上不可能。演算子はそういうもんだと思ってくれ。
回避策は、気に入ってもらえるかわかんないけど
mac.menu << "smile", 100
ではななくて
mac.menu "smile", 100
にするくらいしかない。

def menu(name=nil, price=nil)
 # 引数が指定されていれば追加する
 @menu << [name, price] unless name.nil?
 # メニューを返す
 @menu
end
または
def menu(*args)
 # 引数が指定されていれば追加する
 @menu << args unless args.empty?
 # メニューを返す
 @menu
end

0261デフォルトの名無しさん2010/12/21(火) 09:14:31
プログラム的な話ではないのですが、Rubyについて質問させてください。

よくRuby(Rails)が使用されている代表的なWebサービスとして、
Twitterが挙げられますが、以前はすべてRubyで書かれていたけど、
最近はフロントエンドがRubyで、バックエンドがScalaだと聞きます。

この場合のフロントエンド、バックエンドというのはどの部分を指すのでしょうか?
素人考えにはフロントエンドがUI、バックエンドがDBかなぁとか想像してますが、
そんな分け方するのかな?と疑問に思いました
02622472010/12/21(火) 11:43:51
>>248
ありがとうございます。おっしゃるとおり,Rails3が入ってます。
gem list -l

actionmailer (3.0.1, 2.3.5, 1.3.6)
actionpack (3.0.1, 2.3.5, 1.13.6)
actionwebservice (1.2.6)
activemodel (3.0.1)
activerecord (3.0.1, 2.3.5, 1.15.6)
activeresource (3.0.1, 2.3.5)
activesupport (3.0.1, 3.0.0, 2.3.5, 1.4.4)
rails (3.0.1, 2.3.5, 1.2.6)

ただp Date::today.prev_monthと変更しても,
undefined method `prev_month' for #<Date: 4911103/2,0,2299161> (NoMethodError)
になります。
パッチレベルが低いからでしょうか?
システムデフォルトのとは別にrubyをインスコすべきか,悩みます。
とりあえず,お礼とご報告まで。
0263デフォルトの名無しさん2010/12/21(火) 12:47:16
>>262
rvm入れてgem環境分けておけばいいよ
Rails3が原因なら外しておける
0264デフォルトの名無しさん2010/12/21(火) 14:04:33
古い時代にprevとlastの両方があったわけじゃないので、
使っているActiveSupportのバージョンに応じてprevとlast使い分けて
くだされ。
2.3.8 は移行を意図しているので両方あるはずだけど。

0265デフォルトの名無しさん2010/12/21(火) 17:15:46
こんな流れの中質問するのも申し訳ないんだけど、
公式リファレンスのEnumerable#max {|a, b| ... }の説明でめちゃくちゃ混乱してるんだ
なぜブロックのパラメータはふたつ?とか
「ブロックの値は〜期待してます。」の意味とか
全然理解できない
誰か使い方を教えてください
0266デフォルトの名無しさん2010/12/21(火) 17:23:55
foo が Enumerable だったとして
foo.max は
foo.max{|a,b|a<=>b} と同じ

比較のための値の計算の方法じゃなくて、大小比較の方法をブロックで外付けしてやるわけ。
0267デフォルトの名無しさん2010/12/21(火) 17:34:06
>>265
1. 数値の配列を sort メソッドを使わずに自力でソートするプログラムを書く
2. 1 を拡張して任意のオブジェクトの配列をソートするプログラムを書く

ここらへんまでやれば、たとえ 1 と 2 がうまく書けなかったとしても
max やら sort みたいに比較関数を渡すメソッドの使い方ぐらいは理解できるはず
02682652010/12/21(火) 18:54:51
>>266
比較方法をブロック内に書くのか
全然気づきませんでした。ありがとう。

>>267
あとでやってみます
0269デフォルトの名無しさん2010/12/21(火) 21:01:21
>>261 ってスレ違い?
0270デフォルトの名無しさん2010/12/21(火) 21:44:18
まあだいたいはスレ違い
Rubyに絡めてくれれば乗る人もいたんだろうけど…
0271デフォルトの名無しさん2010/12/21(火) 21:51:19
>>270
そうですかー
>>261が理解出来たら、じゃあなんでRubyじゃダメだったのか、単に速度が遅かったからか、大量のつぶやきをさばけなかったのか、もしくは動的型によるリファクタのしづらさとか、それとももっと違う原因なのか、という部分も知りたいと思ってました

ここじゃスレ違いだとすると、どこで聞くのが適切でしょうか?
0272デフォルトの名無しさん2010/12/21(火) 21:52:14
HTTPでクライアントに応対する部分がフロントで、
DBやファイルや他のデーモン・サービスと連携する部分がバック
だと思えばいいんじゃないかね。
0273デフォルトの名無しさん2010/12/21(火) 22:13:27
基本RubyとRailsはCPUコストやメモリコストが他のスクリプト言語や他のコンパイル済み言語よりも高い
これは単純に(ある程度の)足し算というレベルで高い
ごっつい処理をたくさんの人に提供、とかいうのだと、最終的にPHPのほうが最低2倍は捌ける人数多いと思う

でも、それでもRubyを使う人がいる
この世のあらゆるプログラムをCで記述しないのと同じような理屈
Rubyで初期開発して、処理負荷が間に合わなくなったら他の言語に移る、というのは
Ruby的にはまったく悲しむべき問題ですらない
むしろRubyの優位性を示す出来事であるとすら思う人が多いはず

公開プロダクトを最初から最後までRubyで運用し倒しましたとかいうのは
その人がお金持ちか基地外か過疎プロダクトかどれか
0274デフォルトの名無しさん2010/12/21(火) 23:04:46
>>273
matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
0275デフォルトの名無しさん2010/12/21(火) 23:52:11
Ruby(onRails)を高速化すれば戻って来てもらえると本気で思ってる節があるな
0276デフォルトの名無しさん2010/12/22(水) 01:13:36
Rubyの適用範囲がもっと広ければなあと考える事は
特に作者としては自然なことだと思うが
0277デフォルトの名無しさん2010/12/22(水) 08:07:10
http://jp.rubyist.net/magazine/?0013-BundledLibraries
Net::HTTP.Proxy メソッドは、
Net::HTTP を継承したクラスを作成して、
作成した クラスを返します。
Ruby は非常に柔軟な言語であるため、
メソッド中に動的にクラスを作成して、
そのクラスを返すということが可能です。

このメソッドの中にクラスって意味がわかりません。
普通、クラスを作ってその中にメソッドを定義するのではないですか?
0278デフォルトの名無しさん2010/12/22(水) 08:11:08
質問です
Windowsで下記のプログラムを-Eを付けて実行するとEncoding::UndefinedConversionErrorが
発生します。どのように修正すべきか教えていただけませんか

# coding: utf-8
require 'pstore'
db = PStore.new("pstest")
str = "あいうえお"
db.transaction{ db[1] = str }
db.transaction{ puts db[1] }

C:\home\mechanize>ruby -v
ruby 1.9.1p429 (2010-07-02 revision 28523) [i386-mswin32]

C:\home\mechanize>ruby -Ecp932:utf-8 hoge.rb
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `write': "\xE3" from ASCII-8BIT to UTF-8
in conversion from ASCII-8BIT to Windows-31J (Encoding::UndefinedConversionError)
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `save_data_with_fast_strategy'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:473:in `save_data'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:335:in `block in transaction'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:361:in `synchronize'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:321:in `transaction'
from hoge.rb:5:in `<main>'
0279デフォルトの名無しさん2010/12/22(水) 08:55:56
ああ、pstoreの中のFile.newが外部エンコーディングに引っ張られてるのか
…これどうしよう

>>277
たいしたことしてない
Net::HTTP.Proxy メソッドの定義見るとわかるが、ClassクラスのオブジェクトをClass.newで作って、
それにmodule_evalでクラスインスタンス変数の定義書いて、そのClassオブジェクトを返すようにしてる

klass = Class.new
klass.module_eval{
attr_reader :name
def initialize
@name='A'
end
}
p klass.new.name #=> 'A'

ぶっちゃけこんなマニュアルの中でこんな宣伝する必要なんてないと思うけどね
1.9時代においては削除されるべき無用で紛らわしい雑談だと思うよ、個人的には
0280デフォルトの名無しさん2010/12/22(水) 09:11:16
>>279
マニュアルじゃなくて雑誌記事でわ?
0281デフォルトの名無しさん2010/12/22(水) 09:13:01
pstoreするときだけ外部エンコーディングの影響をなくしたこれなら動く
当たり前だが

# coding: utf-8
require 'pstore'
db = PStore.new("pstest")
str = "あいうえお"
@evacuated_encoding_for_pstore = Encoding.default_external
Encoding.default_external = Encoding::ASCII_8BIT
db.transaction{ db[1] = str }
db.transaction{ puts db[1] }
Encoding.default_external = @evacuated_encoding_for_pstore

puts してるのは UTF-8 エンコーディングの UTF-8 バイナリ列のままだから
コマンドプロンプトでは化けるので注意
0282デフォルトの名無しさん2010/12/22(水) 09:28:50
>>281
ありがとうございました。
リファレンスちゃんと理解できるよう出直します。

私のところでは、化けずに出力されてます。
0283デフォルトの名無しさん2010/12/22(水) 09:33:59
どっちかというと、File にエンコーディングを指定できない(または固定しない) PStore 側がへなちょこなんだと思う
ユーザー側にあんまり非はないし、この対処をマニュアルから読み取るのは不可能なんじゃないかな
0284デフォルトの名無しさん2010/12/22(水) 10:19:08
>>275-276
言語のユーザーや仕事の開発者としては、Ruby向いてないところに差し迫ったら乗り換えて当然と思ってしまうけど
Matzは立場上(本気でそう思ってなくても)悔しがらないとあかんのでは?w
0285デフォルトの名無しさん2010/12/22(水) 10:44:23
>>277
>メソッド中に動的にクラスを作成して、
>そのクラスを返すということが可能です。
>
>このメソッドの中にクラスって意味がわかりません。

メソッドの中でクラスを作成し、それを返す。ただそれだけ。

これはもとのマニュアルが悪いな。「動的に」なんて初心者にわかるはずがない。
直すなら
「メソッドの中でクラスを作成して返します」
「メソッドを実行するたびにクラスを作成して返すことができます」
とか。
0286デフォルトの名無しさん2010/12/22(水) 11:18:44
>>284
それは単に表面的なスタイルの問題じゃないの?
インデント強制だからPython は嫌だとか言ってる人たちを思い出すな
0287デフォルトの名無しさん2010/12/22(水) 11:20:24
どこをどう読めば>>284がスタイルの問題になるのかまったくわからない。
アンカーミスだよな?
02882862010/12/22(水) 11:22:51
>>287 すまん。確かに275-276が違う所をさしてるように見えてしまった
0289デフォルトの名無しさん2010/12/22(水) 12:22:12
最近Rubyはじめたんですが、クロージャのような無名の処理はみなさんどうやって文書化してます?
0290デフォルトの名無しさん2010/12/22(水) 12:27:25
ソースがドキュメント
0291デフォルトの名無しさん2010/12/22(水) 15:23:46
jrubyのnkfが壊滅的なのですがどうすればいいんでしょうか
jrubyで文字コード変換するなということなんだろうか
0292デフォルトの名無しさん2010/12/22(水) 16:21:18
>>291
もうJava標準APIを呼んでしまえ。
String#getBytesとかエンコード指定付きコンストラクタとか
Reader/Writerとか。
0293デフォルトの名無しさん2010/12/22(水) 19:09:44
>>274
>matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
うそだぁ
ソースは?
0294デフォルトの名無しさん2010/12/23(木) 07:23:26
>>291
そんなことはない
現在のJRubyの動作は基本的に完全だと外人さんも太鼓判を押している
0295デフォルトの名無しさん2010/12/23(木) 07:46:49
128文字でお釣りが来る国の人の言うことはほんとに当てにならんからのう…

まあNKF.guess組み込んで「エンコーディング対応しました」とか言う日本人もいるからどっちもどっちだが
案の定ISO-8859-xで盛大に誤爆して現在もコードまだ直ってない
君のことだよMechanize
0296デフォルトの名無しさん2010/12/23(木) 09:55:16
>>294
nkfみたいな文脈で外人の太鼓判は信用できないwww
0297デフォルトの名無しさん2010/12/23(木) 11:55:09
railsの機能をirbで使うにはどうしたらいいのでしょうか?
たとえば、
rubyでhtmlタグを文字列から除去する方法(正規表現) - YomuKaku Memo
http://memo.yomukaku.net/entries/51
のstrip_tagsメソッド

irbではエラー
str= open("http://railstutorial.org/ruby-on-rails-tutorial-book")
p strip_tags str

0298デフォルトの名無しさん2010/12/23(木) 12:18:43
strip_tags は actionpack の SanitizeHelperモジュールで定義されている。
いろいろ依存しているライブラリがあるので、

require 'erb'
require 'active_support/dependencies/autoload'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/string/encoding'
require 'active_support/concern'
# 面倒&初期化の重さを厭わないなら require 'active_support/all'

require 'action_view/helpers/capture_helper'
require 'action_view/helpers/sanitize_helper'

必要ならさらに include ActionView::Helpers::SanitizeHelper
0299デフォルトの名無しさん2010/12/23(木) 12:36:44
必要ならつーかモジュールのインスタンスメソッドだからincludeせんと。
0300デフォルトの名無しさん2010/12/23(木) 12:41:22
Rails3をインストールして、
適当にアプリ作る。
そこで
rails console
でrailsがバックにあるirbが使える
0301デフォルトの名無しさん2010/12/23(木) 13:59:31
rails consoleでもObjectにActionView::Helpers::SanitizeHelperが
includeされるわけじゃない(本来ビューレンダリング用のものだし)ので、
そこは必要。

ただし、helper というビューオブジェクトが存在するので、include
しなくても
helper.strip_tags('...')
とは出来る。
0302デフォルトの名無しさん2010/12/23(木) 14:20:31
そういうのを調べるのってリファレンスを見てるんですか?
日本語のまとまった情報とか無いですよね・・・
0303デフォルトの名無しさん2010/12/23(木) 15:24:50
strip_tags については、リファレンスで SanitizeHelper のものだと
分かるので、あとはそれを使う環境を整えるために試行錯誤するだけ。
0304デフォルトの名無しさん2010/12/24(金) 01:21:41
まあそのへんはRailsスレに行けばわか…わか…、

まあ、Railsも使っててRuby本体にも造詣のある人は少なくないだろうし
わかるんじゃないかなあと思う
RailsのことはRailsスレでやれバーカバーカというよりは、単に遭遇確率の問題
0305デフォルトの名無しさん2010/12/24(金) 13:21:04
irbでrequire '"action_view"; include ActionView::Helpers::SanitizeHelperしただけだと
足りないメソッドあるし使えないから面倒くさい

rails consoleのhelperから使った方がいいな

前はrails consoleから簡単に使えないメソッドもあったし(確かcontrolに依存していたり、内部で擬似的にリクエスト発生が必要だったり?)
そういうのは徐々に改善されていっているようだけど
0306デフォルトの名無しさん2010/12/25(土) 00:35:43
Rubyのソースファイルと実行結果が一緒に表示できるxmpfilterが便利
インストール。
$ gem install rcodetools

0307デフォルトの名無しさん2010/12/25(土) 11:38:05
>>306
[ruby-list:47063] Ruby逆引きハンドブック & xmpfilter (was: Re
http://permalink.gmane.org/gmane.comp.lang.ruby.japanese/6175


これか、よくブログでコードに

1 + 2 # => 2

と表示されるのってxmpfilterなのか
エディタのサポートあれば便利だな
0308デフォルトの名無しさん2010/12/25(土) 11:49:39
言えない、手書きでやってたなんて絶対に言えない
0309デフォルトの名無しさん2010/12/25(土) 14:46:17
日頃Windows版でのテキストファイルの読み込みの遅さに辟易していましたが
ふとバイナリモードにしてみたところ、これまで30秒程かかっていた読み込みが
1秒足らずで終わりました。後から強制エンコーディングするにもおつりが出る速さです。
なぜこんなにテキストモードのI/Oは遅いのでしょうか?
0310デフォルトの名無しさん2010/12/25(土) 14:55:35
実装者に文句言ってけれ
知らないよ
0311デフォルトの名無しさん2010/12/25(土) 15:06:57
> なぜこんなにテキストモードのI/Oは遅いのでしょうか?
そりゃ1バイトずつ内容チェックしていって
CR LF の並びがあれば "\n" に変換するという「無駄」な処理があるからに決まってるじゃん
変換がないだけならただ読んで終了だもの
0312デフォルトの名無しさん2010/12/25(土) 15:12:05
データを読んだからにはそれに対するメインの処理を施すわけだが、
テキストモードで「改行コードを置換する」だけの処理がメインの処理よりも時間がかかるなんてことがあるのだろうか!
0313デフォルトの名無しさん2010/12/25(土) 16:29:23
判断の処理とかさせるからだろ、
フールセーフ(アフォでも安全)というか、
自動判別させる処理とか裏で動いているから、
0314デフォルトの名無しさん2010/12/25(土) 16:30:35
下のようにスクリプトファイルにテキスト名を指定せずにコンソールで指定するにはどうしたらいいのでしょうか?

File.open("sentence.txt").each{|line| ...
0315デフォルトの名無しさん2010/12/25(土) 16:46:34
コンソールからファイル名を読み込んで変数に代入しておき
openにその変数を指定するとかではなく?
0316デフォルトの名無しさん2010/12/25(土) 16:55:22

そういう一手間がいるんですね。
C:\>xxx.rb xxx.txt > xxx1.txt
みたいなわけにはいかないのでしょうか?他の言語かじったときのイメージでこんな
かんじでいけなるのかと勝手に思ってたのですが。
ぐぐってもでてこないのだから、ダメなんでしょうね。
0317デフォルトの名無しさん2010/12/25(土) 16:59:09
テキストモードだとファイルの読み込み30秒、メインの処理1秒でした。
ちなみにCSVファイルの加工です。
0318デフォルトの名無しさん2010/12/25(土) 17:04:40
そもそもコンソールってなんじゃらほ

スクリプト起動時の引数に指定してそれを利用するパターン(推奨)

inputed = ARGV[0]
file = open(inputed, 'rb'){|f| f.readlines}
puts "#{inputed} has #{file.size} lines"

実行:
$ ruby hoge.rb sentence1.txt
$ ruby hoge.rb sentence2.txt

スクリプトを起動して対話的に指定するパターン(一見凄いが後々意外とめんどい)

puts 'ENTER FILEPATH: '
inputed = $stdin.gets.chomp
file = open(inputed){|f| f.readlines}
puts "#{inputed} has #{file.size} lines"

実行:
$ ruby hoge.rb
ENTER FILEPATH: ← ここでキーボードからファイルパス入力してenter


ちなみにこの file.size は実際の行数を必ずしも反映してない
あと、ユーザーの入力が信用できない場合openにそのまま渡してはいけない
0319デフォルトの名無しさん2010/12/25(土) 17:05:37
>>316
それは出力だろ
出力ファイルの名前のことなのか
君のレスは情報の多くが欠落している
欠落した情報でググっても何も出てくるはずもない
0320デフォルトの名無しさん2010/12/25(土) 17:06:51
>>314
普通に書けば、
while line = gets
 puts(line)
end

組み込み変数で明示的に書けば、
while line = $stdin.gets
 $stdout.puts(line)
end

ドヤ顔したければ、
while gets; puts $_; end
0321デフォルトの名無しさん2010/12/25(土) 17:08:09
>>318
初心者スレに初心者がレスすると不幸を生むから見てるだけのほうがいい。
0322デフォルトの名無しさん2010/12/25(土) 17:12:30
>>316
Rubyの標準入力はIOオブジェクトとしてグローバル変数$stdinからアクセス可能
Rubyの標準出力はIOオブジェクトとしてグローバル変数$stdoutからアクセス可能
puts や print のデフォルト出力先は $stdout
スクリプト起動時の引数はARGV
「起動時引数をファイルとみなして開いたIOオブジェクトとみなすが、空の場合は標準入力に切り替える」のはARGF

…ていうか、標準入力や標準出力、起動時の引数を知ってればこれにたどり着くだろうから、
もしかして「コンソール」という言葉を知ってて呼び名を知らないんか
0323デフォルトの名無しさん2010/12/25(土) 17:13:37
関係ないけど、最近の若いもんにちょっとテキスト処理のプログラム課題を与えたら、
とりあえずopenで開く人が多くて、なんだかなぁって感じがする。
普通は標準入出力使ってフィルタを作るだろ…言わなくてもそうなるだろ…?
どうしてopenつかうんだよもぉぉぉぉぉ!
0324デフォルトの名無しさん2010/12/25(土) 17:15:08
>>314の回答は>>318だと思う
open して read する

  対象のファイルの名前

を"コンソール"から指定したいのだろ
0325デフォルトの名無しさん2010/12/25(土) 17:16:27
あとストリームを一気に読み込もうとする人!
なんなんだよ!1行ずつ読み込んで1行ずつ処理しろよぉ!
そうしたほうが省メモリだろぅ!
「でもメモリいっぱいあるし」
まぁそうだけどさぁ…><;
メリークリスマス!
0326デフォルトの名無しさん2010/12/25(土) 17:18:58
お前の言ってるコンソールは、もしかしてコマンドライン?
0327デフォルトの名無しさん2010/12/25(土) 17:19:24
>>324
File.open("sentence.txt").each{|line|
# ここで読み込んだ内容を別途ファイルに保存したいが、
# 書き方がわからないので空欄にして質問しました
}

という質問の可能性を排除するような視野の狭い人は初心者スレで回答すべきではない
そもそも読み込み対象のファイル名は既に記載されてるではないか
なんでそれをユーザー入力させると誤読するのかマジ理解不能
0328デフォルトの名無しさん2010/12/25(土) 17:22:01
なんだ冬休みか...
0329デフォルトの名無しさん2010/12/25(土) 17:22:03
>スクリプトファイルにテキスト名を指定せずにコンソールで指定
0330デフォルトの名無しさん2010/12/25(土) 17:23:55
>>327
いくつもの可能性があるからいちいち聞きなおさにゃならん
記載されてるファイル名をベタ書きしたくないと普通は解釈する
0331デフォルトの名無しさん2010/12/25(土) 17:24:59
はいはいはい、引数に何か指定させようとする馬鹿は全員帰ってね
それは元質問の「スクリプトファイルにテキスト名を指定」で既に行われてるから
引数によるファイル名の指定をやりたくないという質問なのこれは
0332デフォルトの名無しさん2010/12/25(土) 17:27:29
>>331
テキスト名をコンソールで指定したい、だからファイル名を対話的に入力したいんだろ要は
>>318の後半でいいじゃん
0333デフォルトの名無しさん2010/12/25(土) 17:30:22
でも>>316みたいにやりたいのなら引数で渡したいってことじゃないのか
0334デフォルトの名無しさん2010/12/25(土) 17:30:39
コンソールって言ったら普通は端末(エミュレータ)だろ
引数から入力したいならそういう風に言うはずだから、端末から入力する方法を答えればいい
とりあえずは gets でいいんじゃね
0335デフォルトの名無しさん2010/12/25(土) 17:42:19
とりあえず

ruby hoge.rb in.txt > out.txt


「ruby を hoge.rb と in.txt を引数にして起動し、標準入力のリダイレクトで out.txt に書き出す」
と読めてるかどうかでかなり説明レベルが違うような…
これなら「起動時の引数をrubyから取得する方法」と「標準出力

って、標準出力にはそれこそ普通に出力されててそれ以降はRubyの仕事じゃないじゃないですかやだー!

…引数を複数取ってrubyで利用する方法がわかればいいような気がする

ruby hoge.rb in.txt out.txt

と書いて in.txt を読み込んで out.txt に書き出す、ができれば満足されそうな
つまりはシェルのリダイレクトやらパイプやらを使用したくないんじゃないかと
>>316を読む限り、コンソールという概念を勘違いしてるという読みは正しいと思う
0336デフォルトの名無しさん2010/12/25(土) 17:46:05
ruby -n が欲しいんじゃないかなー
>>316の「ほかの言語」はawkとかだと推測
■ このスレッドは過去ログ倉庫に格納されています