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

Ruby初學者スレッド Part 9

■ このスレッドは過去ログ倉庫に格納されています
0001紅寶石2006/11/21(火) 08:33:42
まずはマニュアル

マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/


前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/

>>2-10
0303デフォルトの名無しさん2006/12/08(金) 23:25:10
フォルダの最終懇親時間を書き換えようと思って File.utime() を使ったんだけど
Permission denied で書き換えられなくてちょっと困ってます。
どうすればいいでしょう。
環境は ruby 1.8.5 (2006-08-25) [i386-mswin32] の win2000 です。
0304デフォルトの名無しさん2006/12/08(金) 23:30:49
クラスメソッドを定義するのに
特異メソッドの定義方法を用いると
どうなります?

なんか、どこかで見かけた気がするんですが。。
0305デフォルトの名無しさん2006/12/08(金) 23:43:00
どうなります? とは
class << self; endの中に定義するのとの違いは? ってこと?

0306デフォルトの名無しさん2006/12/08(金) 23:46:20
こういうのを期待しているんじゃないかな。
obj.class.define_method(new_method_name, defined_method)
0307デフォルトの名無しさん2006/12/08(金) 23:52:59
Rubyではクラスメソッドとは
「Classクラスのインスタンスである何らかのクラス定数」
に対する特異メソッドである。なので、通常の特異メソッドと同様、

def String.new_with_upcase(src)
new(src.upcase)
end

と出来て、

greeting = String.new_with_upcase("hello, world")
puts greeting #=> HELLO, WORLD

こういう、「書き方」を質問しているのかしらん。

0308デフォルトの名無しさん2006/12/08(金) 23:53:55
http://shugo.net/jit/20050328.html

この記事、理解できないんですけど、
どういうことなんでしょう??
03093032006/12/08(金) 23:56:51
自己解決しました。

explorerでフォルダ開いてたせいでPermission deniedが出てたようでした。
0310デフォルトの名無しさん2006/12/09(土) 00:01:46
>>304
こんな感じじゃない??

class Example
class << self
def show
puts "SHOW"
end
end
end

Example.show
0311デフォルトの名無しさん2006/12/09(土) 03:30:44
>>308
forを使った場合、midはforの外も含むスコープに含まれる。
ということは、define_methodに渡しているブロック内のmidもそれになる。
で、for終了時点でmidの中身は:getcなので、せっかく定義した
readもgetsもgetcも、全部getcを呼び出してしまう。

eachを使ってブロックの引数としてmidを使った場合は、
midのスコープはeachのブロック内で閉じる。
だから、define_methodに渡しているブロック内のmidは、
ちゃんとそれぞれ別々の物になる。

言葉で説明するとどうもうまく書けないけど、これで通じるかな?
0312デフォルトの名無しさん2006/12/09(土) 15:10:16
あるページのJAVAスクリプトからデータをサーブレットにPOST?して
検索結果のページを取得したいのですが、rubyではどうすればよいのか
ヒントをお願いします。
************************************************
 function postApmtData( actNamS, actMthdS , aptIdS ){
  var formC   = eval( "document." + frmNamS ) ;
  var tempAction = formC.action ;

  formC.actNamS.value  = actNamS ;
  formC.actMthdS.value = actMthdS ;
  formC.aptIdS.value = aptIdS ;
  formC.action = 'http://xxx.jp/yyy/Servlet/zzz' ;
  formC.submit( ) ;

  return false ;
 }
************************************************
 onClick="JavaScript:postApmtData('ArrNormalSearch'
                 ,'topFromApLst'
                 ,'588');return false;"
0313デフォルトの名無しさん2006/12/09(土) 18:29:52
以下のスクリプトで”不正なアクセスです。”となります… orz

require 'net/http'
Net::HTTP.version_1_2

File.open( 'result.html', 'w' ) {|f|
 Net::HTTP.start('xxx.jp', 80) { |http|
  response = http.post('/yyy/Servlet/zzz', \
        "actNamS=ArrNormalSearch&" + \
        "actMthdS=topFromApLst&" + \
        "aptIdS=588")
  f.write(response.body)
 }
}
0314デフォルトの名無しさん2006/12/09(土) 19:04:47
getはどうすか
0315デフォルトの名無しさん2006/12/09(土) 19:42:33
見づらいから ¥ やめれ。その位置ならいらない。
0316デフォルトの名無しさん2006/12/09(土) 20:03:04
通常の特異メソッド、って何だか変なひびき。
03173082006/12/09(土) 21:44:32
>>311
ありがとうございます。
スコープの問題なんですね。

forを使った場合は
readメソッドの定義内では、@input.send(mid,*args)
getsメソッドの定義内では、@input.send(mid,*args)
getcメソッドの定義内では、@input.send(mid,*args)
で、結局 mid は:getc だということでしょうか。

blockを使った場合は
readメソッドの定義内では、@input.send(:read,*args)
getsメソッドの定義内では、@input.send(:getc,*args)
getcメソッドの定義内では、@input.send(:gets,*args)

という風になってるようなんですが、
スコープというより、定義するタイミングの問題でもあるんでしょうか。

ちょっと、理解できなかったですorz
0318デフォルトの名無しさん2006/12/10(日) 00:43:17
クラスの特異メソッドとインスタンスの特異メソッドはほんとは違うんだけどな。
0319デフォルトの名無しさん2006/12/10(日) 00:50:21
クラスもClassクラスのインスタンスなんだから、
同じなんじゃないの?
0320デフォルトの名無しさん2006/12/10(日) 04:30:55
特異クラスの作られ方とかが違う気がするが複雑すぎてわからん
03213112006/12/10(日) 05:19:57
>>317
いや、スコープのせいで、forの場合のmidは全部同じ変数、
eachの場合のmidは3回繰り返すそれぞれで別の変数、になってる。

だから、forの場合は最後にmidに代入された:getcがmidの値になるし、
eachの場合はそうでない。
0322デフォルトの名無しさん2006/12/10(日) 15:58:46
>>318
クラスの特異メソッドは継承されるとかそういう話?
0323デフォルトの名無しさん2006/12/10(日) 18:13:15
string::index や string::gsub が
HTMLコメントの<!-- -->を無視するんですが
どうすれば検索できるんでしょうか?
0324デフォルトの名無しさん2006/12/10(日) 18:44:04
>>323
まずコードをコピペしなさい。
0325デフォルトの名無しさん2006/12/10(日) 18:46:00
>>324
了解
03263232006/12/10(日) 18:58:45
スクリプト"index.rb"
f = open("index.html","r")
d = f.read
f.close

p d.index("<!--link_file-->")
p d.index("<--link_file-->")
gets


検索するファイル"index.html"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Ruby</TITLE></HEAD>
<BODY>
<CENTER>
<TABLE border="1" cellspacing="0" cellpadding="0">
<TBODY>
<TR>
<TD width="200" colspan="2"><--link_file--></TD>
<TD width="590"><!--file_data--></TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
</BODY>
</HTML>

結果
nil
225
03273232006/12/10(日) 19:00:25
ああ!まちがいました。これ違いますorz
03283232006/12/10(日) 19:02:38
サンプル作って検索したら成功します・・・
別の問題かも・・・ごめんなさい・・・あぁ
03293232006/12/10(日) 19:18:08
原因わかりました

検索する前に置換しちゃってました・・・
0330デフォルトの名無しさん2006/12/10(日) 21:25:10
おもろいなおまい。
0331デフォルトの名無しさん2006/12/10(日) 23:13:54
string = "ajtalktjalgjalkjclkklfgjaklgajkltatataagagagaga"

このような文字列があったとして

string[num - 10,10]
このようにして配列を抽出するとき、numが10だと10から10個手前の文字10文字を抽出しますが
numが1だと-9,10 numが7だと-3,10となり後ろから数えた文字を抽出してしまいます。
そうではなくて、numが7だとすると 7から10個手前の文字といきたいところですが
10文字もないのである分の7文字を抽出するにはどうしたらよいのでしょうか?

普通に、[num - 10 ,10] のようにやるとnumが10より小さいと[-3,10]のようにマイナス指定になってしまいます。
マイナス指定するのではなく、10より小さいとnumから10までの文字を抽出するようにしたいのです。
0332デフォルトの名無しさん2006/12/10(日) 23:22:22
>>331
場合分けするしかないのでは?
0333デフォルトの名無しさん2006/12/10(日) 23:31:45
string[(num - 10).abs, 10]

でいいのかな?
0334デフォルトの名無しさん2006/12/10(日) 23:32:45
あああ、10-numじゃなくてnumそのものなら場合分けするしかないね。
string[ num < 10 ? num : num - 10, 10]とか。
0335デフォルトの名無しさん2006/12/10(日) 23:42:28
質問です

渡された引数が
true か false ならそれをインスタンス変数に保存し
それ以外(nilも)なら例外を出す

って処理を書きたいのですが

def test(b)
  if b == true || b == false then
    @b = b
  else
    raise TypeError
  end
end

って冗長な気がします。
TrueClass と FalseClass を纏めるクラスもなさそうなので
クラスでの判別にすると更に冗長になりそうですし。

短い書き方無いでしょうか?
0336デフォルトの名無しさん2006/12/10(日) 23:43:24
string[[0,num-10].max, [10,num].min]
0337デフォルトの名無しさん2006/12/10(日) 23:46:01
あるいは string[0...num][/.{0,10}$/] かな。
0338デフォルトの名無しさん2006/12/10(日) 23:48:48
>335
[true, false].include?(b) くらいかな。

しかしたぶん、そのような処理を書かなきゃならんという考えが
何かの間違いだと思う。
0339デフォルトの名無しさん2006/12/10(日) 23:56:01
舞波のひとが似たようなことで悩んでたがあれは
0 or 1にする話だったからちょっと違うな。
ttp://wota.jp/ac/?date=20061121#p01
0340デフォルトの名無しさん2006/12/10(日) 23:58:59
>>338
うむ

いっそ全体を書き直したほうが今後のためにもいいかもしれん
習作的なものや作り始めたばかりなのなら思い直せ
0341デフォルトの名無しさん2006/12/11(月) 00:19:17
>>331
--- [nth, len]
nth バイト番目から長さ len バイトの部分文字列を返しま
す。nth が負の場合は文字列の末尾から数えます。
nth が範囲外を指す場合は nil を返します。

ということなので、何か根本的な勘違いしてないかい?
irb(main):004:0> 'abcdefghijklmnopqrstuvwxyz'[0,10]
=> "abcdefghij"
irb(main):005:0> 'abcdefghijklmnopqrstuvwxyz'[10,10]
=> "klmnopqrst"

# 文章で説明するよりもテストコードなり何なりで期待する結果を書いた方が
# いいような気がする。
0342デフォルトの名無しさん2006/12/11(月) 00:33:42
if ARGV.empty?
$stderr.puts "引数なし"
exit 1
end

これを設定したのですが、
ruby プログラム 引数1 引数2 でプログラムが正常に動作するプログラムを付くっ単おですが
引数2 を指定せずに実行すると
引数なし と設定したエラーが出ずに 引数2がないため開けないので別のエラーがでます。

if ARGV.empty? どうやらこれでは第1引数だけしか判断しないようなので
ARGV[0]
ARGV[1] をそれぞれif文で指定したのですが、できませんでした。

一括で、引数のempty? の判定をする方法はないのでしょうか?
よろしくお願いします。

0343デフォルトの名無しさん2006/12/11(月) 00:37:09
>>335
module BoolClass; end
class TrueClass; include BoolClass; end
class FalseClass; include BoolClass; end

def test(b)
@b = b if b.kind_of?(BoolClass) or raise TypeError
end
0344デフォルトの名無しさん2006/12/11(月) 00:50:22
>>342
まず、一括で引数のempty?ってのはなんか誤解してる気がする。
ARGVってのは配列で、ARGV.empty?ってのはその配列の中に
何かが入っているかどうかを判別しているんだよ。
だから、引数がまったく与えられなかったときにtrueになる。

よくわからんけど、引数の数が丁度2のときに処理をするの?
だったら、

raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2

とかやった方がいいんじゃない?
0345デフォルトの名無しさん2006/12/11(月) 00:51:39
>>331
len = [num, 10].min
string[0..num-1][-len,len]
0346デフォルトの名無しさん2006/12/11(月) 00:51:55
>>342
最初に
p ARGV
としたらどうなるか?
0347デフォルトの名無しさん2006/12/11(月) 00:52:54
あ、345はナシ

引数の数(ARGV.size == 2)で調べるところだね、これは。
0348デフォルトの名無しさん2006/12/11(月) 00:54:50
345じゃない346
連投スマソ
0349デフォルトの名無しさん2006/12/11(月) 02:45:25
よくオブジェクトの初期化とかで
obj.new(:foo => "hoge", :bar => "hage")
とかの先頭にコロンついた変数名をよく見るのだがこれって何?
単なる習慣?
0350デフォルトの名無しさん2006/12/11(月) 04:06:06
コロンがついているのは変数名ではない。Symbolのリテラル表記だ。
obj.new(:foo => "hoge", :bar => "hage")
は
obj.new({:foo => "hoge", :bar => "hage"})
と書いたのと同じ意味だ。つまり、obj#newにHashを渡している。

で、なぜSymbolオブジェクトをHashのキーにしているかというと、

・タイプしやすい。文字列に比べて1文字少なくて済む
  obj.new("foo" => "hoge", "bar" => "hage")
 とタイプするよりは楽だということ。
・Symbolの方がStringよりも生成時に性能的に有利。
 Symbolは内部的には整数で表されてるんで。

ということかな。まあ慣習で強制されているものではないので、
SymbolではなくStringをHashのキーに取る実装もあり得るし存在している。
0351デフォルトの名無しさん2006/12/11(月) 06:15:30
>>350 とんくす。Rubyはタイプするときに楽という理屈でわかりにくい記述があるから困る
0352デフォルトの名無しさん2006/12/11(月) 07:57:18
>>351
Symbolのリテラルは見慣れないとぎょっとする表記だけど、
慣れたらなかなかいいもんですよ。ここは慣れですw
03533352006/12/11(月) 09:49:33
>338-343
うーん。コードが長くなってきて
クラスの海をどう渡ろうかなと。
それでちょっとだけ型判定を。

その後true/falseでなく専用のクラスを作り
そのインスタンスを2つ作り定数にしました。

いっそこうなったらトコトンやろうかと。
クラスを以てクラスを制すつもりで。
中途半端に組み込みクラスを使うより
むしろ判りやすい気がしました。
0354デフォルトの名無しさん2006/12/11(月) 10:33:26
335で冗長なんて思ってたらなにもできんよ
0355デフォルトの名無しさん2006/12/11(月) 10:33:28
たかだか1バイトじゃねーか、とは思うが、Lispかじってると
なにかとシンボルを使いたくなる。
0356デフォルトの名無しさん2006/12/11(月) 11:56:46
文字列をIOストリームのように扱うことってできないでしょうか?
例えば、ネットワークから読み込んできた文字列 sを、
s.read(2)
などのように、先頭から順番に読み込みたいのですが。

今は、
value = s[index]
index += 1
などのようにしていて、面倒です。
0357デフォルトの名無しさん2006/12/11(月) 11:59:46
>>356
StringIOを使いましょう。
http://www.ruby-lang.org/ja/man/?cmd=view;name=StringIO
0358デフォルトの名無しさん2006/12/11(月) 12:11:50
>>357
おお。ちゃんと用意されているのですね。
ありがとうございました。
0359デフォルトの名無しさん2006/12/11(月) 12:35:05
s = File.read('file') #ファイルが空の場合もアリ
a, b = s.split(//)
print(a, b)

a,bにnilが代入された時は「空文字列」を設定したいのですが
何かエレガントな書き方はありますか?
とりあえず今は、1つずつ
a = a || ''; b = b || ''
みたいにやってるのですが、変数の数が増えると大変なので
もっと簡潔に書ける方法があると良いのですが。
0360デフォルトの名無しさん2006/12/11(月) 12:47:55
print "#{a}#{b}"
0361デフォルトの名無しさん2006/12/11(月) 13:17:32
a, b = s.split(//) + [ '', '' ]
でいけるのかな。

あと
a = a || ''
は
a ||= ''
とも書ける。

0362デフォルトの名無しさん2006/12/11(月) 13:24:58
>>360
こんな場合にエラーなく処理させたいんです。
今は分割した物を、その都度 a = a || '' みたいにしてるんですが…

s = File.read('file') #空の場合もあれば 'w x|y z' みたいな場合もあり
a, b = s.split('|')
c, d = a.split(' ')
e, f = b.split(' ')
print(a, b, "\n", c, d, "\n", e, f, "\n")
0363デフォルトの名無しさん2006/12/11(月) 13:27:58
>>361
おおっ、エレガントだ!
ありがとうございました。
0364デフォルトの名無しさん2006/12/11(月) 13:30:57
(a ? a : "").split(' ')
0365デフォルトの名無しさん2006/12/11(月) 13:35:31
>>364
そういう方法もありますね。
一つ勉強になりました。
03663562006/12/11(月) 13:39:44
StringIOを使っていたのですが、ちょとハマってしまいました。
文字列、といっても中身はバイナリデータなのですが、

6A 0D 0A 00 00 51
のようなデータの場合、
seekや、readなどで、0Dが飛ばされて処理されてしまいます。

たぶん、0D0Aが改行コードと認識されているのですが、
飛ばされないようにするというか、バイナリとして扱うことはできないのでしょうか?
03673562006/12/11(月) 13:46:06
binmodeも試しましたが、駄目でした orz

もしかしたら、根本的な問題なのですが、
バイナリファイルを扱うのに、StringIO(IOストリーム)は向いていなかったりしますか?
今は、seekとreadなどで、読もうとしています。
0368デフォルトの名無しさん2006/12/11(月) 13:58:39
うちでは\rも\nも普通に扱えてるけどなぁ。
ファイルから読み込むときに既に\rが落ちてしまってるとか言うことはない?
0369デフォルトの名無しさん2006/12/11(月) 14:01:18
Windows上で、元ファイルのopenのときにバイナリモードにしてないとか。
0370デフォルトの名無しさん2006/12/11(月) 14:01:59
ああ、ごめん。ネットワークとかから元データ取ってくるのか。
0371デフォルトの名無しさん2006/12/11(月) 14:04:41
すみません、もう一つだけ。
教えてもらった事を参考に↓みたいにしたのですが
エラーなく処理させるには、これがベストでしょうか?

s = File.read('file') #空の場合もあれば 'w,x|y,z' みたいな場合もあり
a = s.split('|')
c, d = (a[0] ? a[0] : '').split(',') + ['', '']
print c, d
03723562006/12/11(月) 14:05:53
元データは、open-uriのopenで取ってきたデータなのですが、
ファイルに出力すると、ちゃんと
 6A 0D 0A 00 00 51
になっていました。
ですが、StringIO経由だと、
 6A 0A 00 00 51
になってしまいます。

うむむ
03733712006/12/11(月) 14:10:29
File.read('file') で読み込んだデータは
'a,b|c,d|e,f|g,h|..' みたいにずっと続くので
最初の分割は
a = s.split('|') みたいに配列にしないとマズイです。
x, y = a.split('|') みたいにするとマズイ。
03743562006/12/11(月) 14:13:47
# ファイルからバイナリモードでopenした場合
io = open(OUT_FILE + ".bin", "rb")
# StringIOで、Openした場合
# io = StringIO.open(s, "rb")

value = io.read(4)
puts sprintf('%x %x %x %x', value[0], value[1], value[2], value[3])

io.close

やはり、ファイルからバイナリモードで読み込んだときと、StringIOでOpenしたときと
挙動が違いますね。
これって仕様でしょうか?

一旦ファイルに落として、再度読み込むのを許容するしかないですかね?
0375デフォルトの名無しさん2006/12/11(月) 14:24:49
>>372
Windowsだと、binmodeで書き出ししない場合
勝手に\nが\r\nに直されてしまうから p sでチェックしてみて。
03763562006/12/11(月) 15:25:45
>>375
あ、ファイルに書き出した時点で、\nが\r\nになっているというお話ですか?

か、確認しました!
バイナリモードで書き出したら、\nが\r\nになっているだけでした。

つ、つまり・・・
 6A 0A 00 00 51
で、正しいです。StringIOは悪くないです。
俺が悪かったです orz
03773562006/12/11(月) 15:26:18
> バイナリモードで書き出したら、\nが\r\nになっているだけでした。
バイナリモードで書き出したら、\nのままでした。
0378デフォルトの名無しさん2006/12/11(月) 16:38:13
わざわざファイルに書き出さなくても
p obj で、objのRubyの内部表現が見られるよ。
03793422006/12/11(月) 19:25:04
何かよくわからなくなってきたので整理します。

引数がないままプログラムを実行するとエラーがでますよね
引数が1つしか指定しない場合だと、
if ARGV.empty? で引数が入力されない場合に
putsしてエラー文を出力します。

でもこれだと、コマンドラインから入力する引数(ファイル名など)が2つある場合だと
この文では、putsのエラー文ではなく、デフォルトのエラーが出てしまいます。

この2つや3つ目の引数をコマンドラインから入力するとなると、
引数が入力されなかった場合や、引数の入力が足りない場合
どのようして、指定のエラー文を出力すればよいのでしょうか?
0380デフォルトの名無しさん2006/12/11(月) 19:30:57
>>379
引数の数は丁度2個欲しいのか、丁度3個欲しいのか、
最低2個は欲しいが3個目も受け付けるのか、
それ以外なのかはっきりしろ。
それと>>344は試してみたのか?
03813422006/12/11(月) 19:35:29
>>380
必要な引数は2つです。でも、3つや4つも一度にできるのであれば知りたいです。
引数はいずれもファイル名です。
>>344についですが、
raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2

引数は入力毎に異なるのでプログラム中に記述できないような気がするのですが・・・
0382デフォルトの名無しさん2006/12/11(月) 19:37:00
ARGVは配列で、でもって配列のempty? は
配列そのものに要素が「1つでも」あるのか、全くないかを判定するためのもの。
それぞれの要素が存在するかを知るためのものではない。
0383デフォルトの名無しさん2006/12/11(月) 19:40:34
>>379
optparse使え。
または、 p ARGV しながらプログラム書け。
0384デフォルトの名無しさん2006/12/11(月) 19:44:36
>>381
わかった。親切にメッセージを出した方がいいと考えたおれがバカだった。

raise if ARGV.size !=2

これでどうだ? 引数の数が丁度2でなかったときは
例外を上げてプログラムを終了する。
0385デフォルトの名無しさん2006/12/11(月) 19:46:27

def main(argv)
raise if argv.size != 2
arg1 = argv[0]
arg2 = argv[1]
# 処理
end

if __FILE__ == $0
main(ARGV)
end

0386デフォルトの名無しさん2006/12/11(月) 20:03:34
unless ARGV.size == 2
だとRubyっぽい。
0387デフォルトの名無しさん2006/12/11(月) 22:52:29
>>381
>引数は入力毎に異なるのでプログラム中に記述できないような気がするのですが・・・

…新手のギャグ?
つprintf
つ式展開
03883422006/12/11(月) 22:58:59
>>384
raise if ARGV.size !=2
$stderr.puts "引数なし"
exit 1
end

文法エラーとでたのですが・・・
0389デフォルトの名無しさん2006/12/11(月) 23:14:27
そのendは、以上という意味だ。
03903422006/12/11(月) 23:18:00
でもそうしないと、exit 1でどのみち終わるのでは??
0391デフォルトの名無しさん2006/12/11(月) 23:20:08
えーと、どういう答えが欲しいんだ、こいつは。
0392デフォルトの名無しさん2006/12/11(月) 23:38:04
常識的に考えてわかるだろ
03933422006/12/12(火) 00:14:22
どうやったら>>>388のendをなくして実行したところ
unhandled exception
とエラーがでています。まだおかしいみたいです
0394デフォルトの名無しさん2006/12/12(火) 00:17:44
それはそれで正しい。rescueしてないから最終的にエラーとして
報告されてるわけ。

03953422006/12/12(火) 00:19:27
なるほどレスキューが必要でしたか。すみません。
empty?でやってたときはrescueがいらなかったので・・・
0396デフォルトの名無しさん2006/12/12(火) 00:29:13
abort "引数なし" unless ARGV.size == 2
0397デフォルトの名無しさん2006/12/12(火) 00:37:52
>>350
あと、キーにシンボルを使うとキーと値が視覚的に区別しやすい。
構文強調をサポートしたエディタではなおさら。
0398デフォルトの名無しさん2006/12/12(火) 00:41:47
>>397
それありますねー。
結構でかい。

そういや、Railsで、シンボルと値の組のハッシュを多用しますけど、
シンボル名を間違えまくる。
それでも動いたりするんですが、
これはRubyの宿命ですか?
0399デフォルトの名無しさん2006/12/12(火) 00:46:45
何が言いたいかって言うと、↓Adaの仮引数みたいに、
Put(Item => 1 + 1, Width => 3);
したいのでしょうけど、記述ミスが痛いということでせう
0400デフォルトの名無しさん2006/12/12(火) 06:13:51
>>395
で、beginつけずにrescueだけつけて、
文法エラーがでてしまいました、とか言い出しそうな悪寒
0401デフォルトの名無しさん2006/12/12(火) 06:42:08
>>398
シンボルはリテラルなのでRubyに限らず間違えても(ry
補完機能つきのエディタ使えよ。
0402デフォルトの名無しさん2006/12/12(火) 19:36:23
Ruby書くのに最適な補完機能つきエディタってあります?
予約語だけじゃなくて、変数までカバーしてくれるやつ。

今はeclipseのrubyプラグインを使ってるんですが、
補完機能が貧弱なので。
0403デフォルトの名無しさん2006/12/12(火) 19:58:03
Railsいじってたときに、RadRails使ってたけど、やっぱり、補完は貧弱ですよね
厳密な補完じゃなくていいなら、(単語レベルなら)
xyzzyのRuby-modeかな。
でもこちらもオマケという程度です。
emacsとかのRuby-modeはどうなんかね?
■ このスレッドは過去ログ倉庫に格納されています