Ruby 初心者スレッド ..
[2ch|▼Menu]
206:デフォルトの名無しさん
09/03/10 14:19:10
ありがとうございます。
そうじゃなくて FileUtils.rm("dist/*") で全部消せないでしょうか(distは消さない)?
カレントディレクトリには間違えなくdistがあります。


207:デフォルトの名無しさん
09/03/10 14:30:09
じゃあ dist の中に * というファイルが無いんだろう

208:デフォルトの名無しさん
09/03/10 14:32:30
>>206
FileUtils.rm とかって単独でグロブを展開できないんじゃないの?
現にエラー見る限り * が展開されてないじゃん

Dir.glob("dist/*").each do |f|
FileUtils.rm(f)
end

とかでいけるんじゃないか。

209:デフォルトの名無しさん
09/03/10 14:36:10
>>207は刺激的で意地悪な回答だと思う

マニュアル眺めれば見当つくが、引数は配列だ
>>208ではなく、Dir.glob の結果をそのまま渡せばいい

210:デフォルトの名無しさん
09/03/10 14:48:25
>>207は本スレに池w

211:デフォルトの名無しさん
09/03/10 19:19:38
>>207はツンデレ

212:デフォルトの名無しさん
09/03/10 23:09:56
calc_a、calc_bという二つのメソッドがありどちらも
return Integer(n) で戻り値を整数にして返します。

n = (中略) * (calc_a / calc_b)

という処理をした時に (calc_a / calc_b) の時点で小数点以下が切り捨てられてしまいます。
(calc_a / calc_b) は本来 1 より大きく 2 より小さい値にしようと思っていたのですが、どうすればよいでしょうか?

213:デフォルトの名無しさん
09/03/10 23:14:42
Integer(n) という時点で、何かがまずそうだと思うんだが、それはさておき。
n = (中略) * (calc_a.to_f / calc_b)
でいいんじゃね。

214:デフォルトの名無しさん
09/03/10 23:18:23
少しはマニュアル読めよ


…特に書いてねえええ

整数のメソッドの返り値は整数になってる
小数つきの値を返して欲しいなら小数つき数字のクラスの割り算メソッド使え

irb> 10 / 3
3
irb> Float(10) / 3
3.33333333333333


215:デフォルトの名無しさん
09/03/10 23:46:26
>>213>>214
無事解決しました。
ありがとうございました。

216:デフォルトの名無しさん
09/03/11 09:05:39
Float(10)
Integer(1.1)
これって何?キャスト???Ruby使ってて始めてみたw
to_fとかto_i使うもんだと思ってた

217:デフォルトの名無しさん
09/03/11 09:07:03
ごめん、壮絶にマニュアルに載ってた。組み込み関数なのね。
to_f, to_iとの違いはなんだろ。
レシーバーをもつメソッドの違いとかなし

218:デフォルトの名無しさん
09/03/11 09:13:17
>>217
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-lang.org)

219:デフォルトの名無しさん
09/03/11 09:14:43
>>216
ただの関数的メソッド
URI('URLリンク(www.example.com)'') なんかも有名だが、こんなふうに作る

module Kernel
def URI(uri_str)
URI.parse(uri_str)
end
module_function :URI
end

たいていは特定のクラスメソッドや new つきインスタンスメソッドの別記だけど、
Integer() や Float() のように、特定言語のアレっぽい便利な「ちょっと違う処理」を噛ませてある場合も多い

irb> "10".to_f
10.0
irb> "a".to_f
0.0
irb> Float("10")
10.0
irb> Float("a")
ArgumentError: invalid value for Float(): "a"


220:デフォルトの名無しさん
09/03/11 09:26:53
個人的には Integer() なんかの特殊処理は好きではない
素直に「そのクラスのオブジェクトへの変換メソッドのエイリアス」とだけ設定してほしかった

221:デフォルトの名無しさん
09/03/11 10:20:30
表記が違えば挙動が変わるのはおかしいことじゃない。
関数側で未定義なクラスならto_i等を呼ぶから結果的にエイリアスとしても
振る舞うだけで、関数自体はエイリアスという位置づけでもないし。


222:デフォルトの名無しさん
09/03/11 10:25:33
表記が違うなら振る舞いも変えておけば使い分けできて
(゚д゚)ウマー ってことじゃないの

223:デフォルトの名無しさん
09/03/11 11:35:11
Integer が整ってなかったり Float が浮いてたりするように感じるのは、変換のクラスメソッドがないから
Integer.convert があってそれを Integer() 内で呼んでる、とかそういうめんどっちい構造にすべきだった
いきなり関数形式のメソッドだけ提供されても正直困る

224:デフォルトの名無しさん
09/03/11 11:43:40
関数的メソッド Integer は Integer クラスとは何の関係もないんだよね
名前がたまたま同じだけの、ただの Kernel クラスのメソッド

URI() の定義を初めて見たときは激しくがっかりしたことを覚えている
クラスそのもののオブジェクトに引数を渡す方法があるのかとかちょっと期待してた俺

225:デフォルトの名無しさん
09/03/11 16:24:02
割とがっかりする仕様をそのままにしとくのもなんだかなあ感はあるね。
まあ教祖が放置してるぐらいだから、信者の皆さんに不満は無いのだろうけど。

226:デフォルトの名無しさん
09/03/11 16:35:53
個人的には、微妙に挙動の違う記法を
いくつか用意する方針には納得している
do endとブレース、Procとlambdaみたいなのは、使ってて確かに両方必要だと感じるので

ってかどうせ、変えたら変えたでまた批判されるでしょ?


227:デフォルトの名無しさん
09/03/11 16:51:39
&&, || と and, or だってそうだしな
優先順位が同じになったら困る人が大量発生するだろうなw

228:デフォルトの名無しさん
09/03/11 17:25:54
てかこれはそもそも "a".to_i みたいなのが 0 になるのがおかしい
数字じゃありませんってエラー出せよ

229:デフォルトの名無しさん
09/03/11 17:29:20
まあ、今のRubyで to_i や to_f のメソッドを作ったら例外ブロックとか例外処理引数とかつけると思う
文字列と数値の処理は変なの入れるとRubyスクリプト全体が遅くなるから嫌がられそうだが

230:デフォルトの名無しさん
09/03/11 17:36:44
人のソースを解読しながらの作業なんだけど
変数が宣言されてないのが凄く違和感ある
何かオブジェクトがあった時に中身が何なのかわからないんだよね
慣れればなんとかなるもの?

231:デフォルトの名無しさん
09/03/11 17:45:05
>>230
宣言は = で代入と同時に行われている
これ以外の方法で変数が宣言されることはない(配列の要素とかは別だけど)

で、変数の中身がわからなくて困るというのは、おおむね、変数名つけた人間のセンスがねえ
クラス名から類推されるオブジェクトの名前を変数に付けるのがセオリー

変数が何のオブジェクトか知りたければ、「右辺」の返り値を調べるといい
マニュアルでも、「○○を返します」というのだけは意識的に書かれてるはずだ

これまた稀にマニュアルなのに「××します」とだけ述べてて返り値のクラスについての情報がない奴がいるが、
アホ認定でよし

232:デフォルトの名無しさん
09/03/11 17:51:50
>>228
何を許容し、何をおかしいとするかは言語によるでしょ
少なくとも一様ではない
複数の判断があるからこそ、Rubyでは#to_iとInteger()の二つを用意してあるんでは?

Cのatoiは0を返す
JavaのInteger#parseIntは例外を投げる
Common Lispのparse-integerはデフォルトでエラーを通知するが、
:junk-allowedパラメータによっては多少の不正形式も許容し、それでもダメならnilを返す

233:デフォルトの名無しさん
09/03/11 18:01:31
>>232
いや to_i と Integer() には関連性はないから

234:デフォルトの名無しさん
09/03/11 18:05:44
testfile = "/tmp/testfile"
FileUtils.chown(1000, 1000, testfile)

  #=> /usr/lib/ruby/1.8/fileutils.rb:987:in `fu_get_gid': can't convert
      Fixnum into String (TypeError)
    from /usr/lib/ruby/1.8/fileutils.rb:926:in `chown'
    from test.rb:6

あれ?と思って何度もドキュメントを読み直してみたんだけど、どうしても
わからなくてFileUtilsのソース読んでみたんだが、

  def fu_get_gid(group)   #:nodoc:
    return nil unless group
    if /\A\d+\z/ =~ group

ここでマッチするかを調べる前に、group = group.to_s するのを忘れていませんか?
すぐ上にdefされているfu_get_uid()はStringに変換してあるのに・・・

235:デフォルトの名無しさん
09/03/11 18:42:26
>>231
右辺を見る、まず変数なのかメソッドなのかわからん
どちらにせよ何を返すのかが重要だからそれを調べるために
メソッドが定義されてる部分か変数に代入されている部分を探す
探した先でも代入されてたりして再び右辺を知る必要が生じる

しかも同じ変数を複数の用途に使ってたりするから
直前にアクセスしてるのはどこかを見つけ出して
直前を知る為に分岐で使われる変数の中身を知る必要があって
変数の中身を調べるために代入されている所から右辺を辿って

という状況が3重ぐらいにネストされてる
ってただの愚痴になっちった
俺が慣れてないせいもあるだろうし、スルーでおkです

236:デフォルトの名無しさん
09/03/11 19:30:46
>>235
副作用の少ないスクリプトなら、デバッガ使うか
デバッグプリント書き込んで実行しちゃうのが手っ取り早い。

あとはその変数(オブジェクト)をレシーバにしてるメソッドから類推するとか。
これはduck typingと呼ばれる概念の延長だけど
Stringのメソッド使ってるならStringかそれに似せたオブジェクトだろう、ということ。


237:234
09/03/11 19:56:51
ちょっと無視しないでよー
もしかして僕がバグなんですか?

238:デフォルトの名無しさん
09/03/11 20:09:14
数値で指定できるの初めて知った
ずっと文字列だったから

239:234
09/03/11 20:14:24
>>238
ええ、ただ僕の場合はユーザID、グループIDで指定する習慣となっているので
ちょっと困ります。

FileUtils#chown のユーザIDは大丈夫なのに、グループIDだとエラーが出るので
、それを手がかりにしてソースを読んでみたのです。
初心者なもので、バグかどうかはわかりませんが、fu_get_uid() と
fu_get_gid()を比較してみると、バグなのかな?という疑問もあります。

240:デフォルトの名無しさん
09/03/11 20:20:20
あん、"1000" で通るだろ

241:234
09/03/11 20:24:29
>>240
やだよ。

つかEtcとかFile#Statで得たユーザID、グループIDを
いちいちto_sでStringに変換するくらいだったら、自分でfileutils.rbを修正しちゃうね。
(自分で修正したものを/usr/libに置くのはキモいけど)

242:デフォルトの名無しさん
09/03/11 20:28:40
そういうことをやると、環境構築のたびそこに修正が入るわけだが
ひとりシステムで将来的にも引き継ぎなしとかならいいけど

243:デフォルトの名無しさん
09/03/11 20:34:19
require 'fileutil'
module FileUtils
 alias org_fu_get_gid fu_get_gid
def fu_get_gid(group)
  org_fu_get_gid group.to_s
 end
end

>>234>>237もバグだと思うけど、>>241をやるぐらいなら
モンキーパッチのほうがマシ。動くかはシラネ。

244:234
09/03/11 20:43:53
じゃあ /usr/lib/ruby/1.8/fileutils.rb を適当な場所にコピーして
自分で修正!

def fu_get_gid(group) #:nodoc:
return nil unless group
group = group.to_s # fu_get_uid() にならって、この部分を追加!
if /\A\d+\z/ =~ group
then group.to_i
else Etc.getgrnam(group).gid
end
end
private_module_function :fu_get_gid

これで解決だよw
つーか、この程度のバグも報告されていないとは、実はRubyユーザって
少ないんじゃないの?ww

245:デフォルトの名無しさん
09/03/11 20:47:29
あーはいはいそうだねすごいね

246:デフォルトの名無しさん
09/03/11 20:49:08
少ないけど、何か?

247:デフォルトの名無しさん
09/03/11 20:52:59
>>244
そんなRuby使うのやめちゃったらいいよ
折れは使うけど

248:デフォルトの名無しさん
09/03/11 21:07:41
[#15907] Patch for FileUtils#chown (specifically: FileUtils#fu_get_gid)
URLリンク(rubyforge.org)

249:234
09/03/11 21:15:23
>>248
そのパッチが公開されたの2007年じゃんワロタww
いつになったら適用されるんだろうね

250:デフォルトの名無しさん
09/03/11 21:31:57
redmineに移行して忘れ去られていると見た。


251:234
09/03/11 21:35:44
じゃあ誰か報告してあげなよ。

俺はたいして英語が書けない読めない喋れない聞き取れない
現役高校生だし、当然職業プログラマでもないからやめておくが・・・

252:デフォルトの名無しさん
09/03/11 21:37:42
日本語でおk
なんだが。



253:デフォルトの名無しさん
09/03/11 21:56:37
報告してあげた。
URLリンク(redmine.ruby-lang.org)

254:234
09/03/11 22:03:30
なんだよー、日本語でいいのかよ。

だったら実名で報告しておけばよかったなー。
そんで俺が有名になって、クラスの女の子たちから告白されて
スーパーハカーになっちゃったりして、んでもって将来かわいいお嫁さんと結婚したら
君たちは嫉妬しちゃって鳴門大橋から飛び降りることだろうw

まあとにかく>>253さんありがとう!

255:234
09/03/11 22:04:38
# FIXME

256:デフォルトの名無しさん
09/03/11 22:12:29
フィールドがタブ区切りで、行区切りがCrのデータを処理するときなんですが,
csv = CSV::open('data.csv', 'r')
csv.each{|r|レコード処理その1}
としたあと
csv.each{|r|レコード処理その2}
をしたくてもデータがnilとなっていて,うまく処理できません。
今は,改めてcsv = CSV::open('data.csv', 'r')で再オープンしているのですが
io.rewindみたいなもっといい方法はないですか?
処理の都合上csv.each{|r|レコード処理その1;レコード処理その2}はできません。
(ようするに最後のレコードまでいって,もう一度はじめからの処理が必要)

257:デフォルトの名無しさん
09/03/11 22:37:52
open_readerの定義を参考に
CSV::Reader.parse(io, fs, rs) do end
io.rewind
CSV::Reader.parse(io, fs, rs) do end
とでもやるしかなさそうな気がするが、
CSV再オープンと大して変わらないかな。


258:デフォルトの名無しさん
09/03/11 23:08:07
fastercsvのソースにはrewindがあったけどどう使うかは知らん

259:デフォルトの名無しさん
09/03/12 02:32:42
class C
 def initialize
  @n = 50
 end
 def n
  return @n
 end
 def n=(n)
  @n += n - self.n
 end
end
c = C.new
b = c
b.n = 20
p c.n

これを実行すると20と表示されます

c = 50
b = c
b = 20
p c

これは50と表示されます
ここの辺り、それぞれの結果に差が出る理由などが漠然としか理解できていないのですが
上手く解説してるサイト等ご存知でしたら教えてください

260:デフォルトの名無しさん
09/03/12 02:54:22
# C インスタンスを生成し c に代入
c = C.new
# c のインスタンスに b からもアクセス出来るようにする
b = c
# b(==c) の内部変数に 20 を代入する
b.n = 20
# b と c は同じオブジェクト(C インスタンス)

# 変数 c に 50 を代入 : b=nil c=50
c = 50
# 変数 b に c の値を代入 : b=50 c=50
b = c
# 変数 b に 20 を代入 : b=20 c=50
b = 20
# b と c は別のオブジェクト(20 : 50)

261:デフォルトの名無しさん
09/03/12 03:00:52
センスって都合のいい言葉だな。
でもそのセンス大事な言語仕様なら、もうちょっと厳密に固めた方がいいと思う。今の再利用の際に謎解きが必要な仕様では、オブジェクト指向のメリットである再利用が阻害されるだけ。

262:デフォルトの名無しさん
09/03/12 04:16:25
>>261
《厳密》に動作してるよ
お前のプライドを満たすために言語があるわけじゃない

263:デフォルトの名無しさん
09/03/12 04:24:33
Javaでスパゲティが作れてしまった時点で人類は認識を改めなければならなかった
プログラミング言語側に責任を負わせるのは誤りなのだと

264:デフォルトの名無しさん
09/03/12 08:21:55
>>263
どんだけ、敷居を下げた言語つくってもスパゲッティコードは量産されるの法則

265:デフォルトの名無しさん
09/03/12 08:54:49
質問があります。
RubyでExcelのスプレッドシートを扱う簡単なライブラリでオススメはないでしょうか?
通常はOLE直で使うものなんでしょうか?

266:デフォルトの名無しさん
09/03/12 09:10:11
>>263
頭の中がスパゲッティなら出てくるものもスパゲッティw
これ真理

267:デフォルトの名無しさん
09/03/12 10:07:20
>>265
gem install spreadsheet-excel


268:デフォルトの名無しさん
09/03/12 10:11:05
>>259
どういう動作をするほうがいいと思った?

269:デフォルトの名無しさん
09/03/12 10:32:03
やっぱプログラマも免許制にした方がいいな。
質の悪いプログラマがいつまでも駆逐できない。


270:デフォルトの名無しさん
09/03/12 10:32:13
>>267
License: GNU General Public License (GPL) version 3 (´・ω・`)

納品する時に rubyscript2exe で固めたらGPLの影響受けますよね、やっぱ・・・

ライセンス問題なさそうなのなら、これでいけるかな・・・
RAA - spreadsheet
URLリンク(raa.ruby-lang.org)


271:デフォルトの名無しさん
09/03/12 23:55:38
>>270
ソース公開しちゃいなよw

272:デフォルトの名無しさん
09/03/13 00:29:08
ソース公開したらパクって一儲けします。

273:デフォルトの名無しさん
09/03/13 03:07:30
gem の再インストールをしようと思ってるんですが、今までgemでインストールしたライブラリを全部一気に削除するにはどうすればいいでしょうか?
やはり gem uninstall で一個ずつ手作業?それともgemのディレクトリ削除するだけでgemでインストールしたライブラリも全部削除したことになるのでしょうか?

274:デフォルトの名無しさん
09/03/13 04:23:04
URLリンク(d.hatena.ne.jp)
このページの最初のサンプルを参考に
agent.get('URLリンク(search.yahoo.co.jp)')
の所を
agent.get('URLリンク(www.google.co.jp)')
にしてみら
undefined method `field_with' for nil:NilClass (NoMethodError)
というエラーが出ました、何が原因なでしょうか?

275:デフォルトの名無しさん
09/03/13 04:36:20
>>274
参照ページの処理がYahooのページ構造に依存しているだけ
googleに対応させたければGoogleのページ構造に合わせて
スクリプトを修正する必要がある

276:デフォルトの名無しさん
09/03/13 04:40:55
>>275
具体的にはどこをどうすればいいのでしょうか。
取りあえず、いろいろ試しているんですが分かりません。

277:276
09/03/13 05:43:48
すみません自己解決です、今のところ理由は不明ですが
agent.user_agent_alias = 'Windows IE 7'
を入れてたら動きました、これから理由を探っていきます
ありがとうございました。

278:デフォルトの名無しさん
09/03/13 07:50:36
>>273
gem list | awk '{print $1}' | xargs sudo gem uninstall -a
とかどうだろう
gem のディレクトリを消しても /usr/local/bin とかにスクリプトファイルがインストールされているからね。rakeとか。

279:デフォルトの名無しさん
09/03/13 16:24:22
railsなどrubyで書かれたソースを読むのに便利なツールはないでしょうか?
Cでいうところのgloboe,phpのphpxrefのようなツールがあると最高です。

280:デフォルトの名無しさん
09/03/13 16:36:49
ソース読んだほうが早いということになってる

281:デフォルトの名無しさん
09/03/13 16:39:19
Railsは「Rubyではない」ので、Rubyとは別に考えてください

282:276
09/03/13 16:53:46
たびたびすみません
require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'kconv'
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
page=agent.get(URI.parse('URLリンク(www.google.co.jp)'))
puts page.forms[0]

だときちんとformが表示されるのですがアドレスを
URLリンク(be.2ch.net)
にするとnilといわれます、該当ページのbodyを表示しても
きちんとformは存在しているのでどこかがまずいはずなのですが
分かりません、よろしくお願いします。

283:デフォルトの名無しさん
09/03/13 17:28:52
>>282
あはは、libxml2 は来るなって HTML に書いてある
これは libxml2 がパースできないタイプの HTML の書き方だ

自前で POST するか、あるいは Hpricot を使う

require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'kconv'
WWW::Mechanize.html_parser = Hpricot
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
uri = URI.parse('URLリンク(be.2ch.net)')
agent.get(uri).form_with(:action =>'/test/login.php'){|f|
f.set_fields('m' => ['mail_address'], 'p' => ['password'])
}.click_button

284:276
09/03/13 18:33:26
>>283
ありがとうございます。
まだ良く理解できていないと思いますが精進します。

285:デフォルトの名無しさん
09/03/13 19:13:24
わーい、Mechanize の質問だ

>>283
残念惜しいこれパースできます

>>282
で、はっきり言うと WWW::Mechanize 0.9.2 のバグです(Nokogiri は悪くないです)
Mechanize 内部で UTF-8 に強制変換している可能性をすっかり忘れて、
元の HTML の文字エンコーディングを Nokogiri に渡しています
日本語のサイトで Mechanize を使う場合は、しばらく

agent.get(uri){|p| p.encoding = "utf-8"}

というように、HTML のエンコーディングを UTF-8 に強制指定してください
(irb でも動作するので、この書き方がいちばん楽です)

UTF-8 に変換されない組み合わせというのも確かにあるんですが、
こんなのいちいち覚えるのは無駄なので、とりあえず UTF-8 で試して、失敗したら変更するようにしましょう
Nokogiri との組み合わせを見捨てて、 >>283 のように Hpricot を使うようにしてももろちん構いません

286:デフォルトの名無しさん
09/03/13 19:23:50
Emacsでruby-modeを使うと、if や do を入力すると勝手に end が入力されてうっとおしいのですが
これをやめさせるにはどうしたらいいですか。
do のあとにスペースをいれるとendが入るのに、doの直後で改行するとendが入らないとか
中途半端な仕様なのでやめたいです。

287:デフォルトの名無しさん
09/03/13 19:27:34
>>286
それは ruby-electric の担当であって ruby-mode の仕事じゃないんじゃね

(add-hook 'ruby-mode-hook
'(lambda () (ruby-electric-mode nil)))

これでどう
ruby-electric 自体をやめてしまってもいい

288:276
09/03/13 20:09:05
>>285
ありがとうございます。
>WWW::Mechanize 0.9.2 のバグです
最初に自分で調べていたらそれっぽいなと思いましたがよく分からなかったので放棄してました
有名なライブラリでもバグとかあるんですね、分からずに使ってる身としては早く直って欲しいです。

289:デフォルトの名無しさん
09/03/13 20:26:23
正直なとこ、これに関しては直る可能性はかなり薄いです
開発版で直る機会があったんですが、あっさりエンバグして 0.9.2 になりました
日本語サイトの一般的な利用法に関する知識を持った(そして英語で議論できる)人がいないんです

290:286
09/03/14 00:37:13
>>287
やってみたんですけど変化なしでした。
デフォルトでruby-mode-hook に (ruby-electric-mode t) が設定されているようで、
自分の設定よりもデフォルトの設定のほうが優先されているようです。
(setq ruby-mode-hook
(append ruby-mode-hook '(lambda () (ruby-electric-mode)))
としたほうがいいでしょうか。


291:デフォルトの名無しさん
09/03/14 00:59:26
>>286
ruby-electric-mode の方にその手のことを制御する変数があったと思うけど

(add-hook 'ruby-mode-hook
(lambda()
(inf-ruby-keys)
(require 'ruby-electric)
(ruby-electric-mode t)
;; (setq ruby-electric-newline-before-closing-bracket t)
))

この設定例における変数 ruby-electric-newline-before-closing-bracket に
類するものが他にもあるはずなのでスクリプトを調べてみるべし

292:デフォルトの名無しさん
09/03/14 01:45:47
質問です。RubyにはSQLiteなどが、標準搭載されることはないのでしょうか?
レンタルサーバーや、自分以外の管理の場合に不便です。

293:デフォルトの名無しさん
09/03/14 02:16:37
要望の説得力によってはありえるかもしれない。
過去にreadlineやopensslのラッパーが標準付属になったりしたわけだし。




294:デフォルトの名無しさん
09/03/14 04:54:59
松本尊師が拒否したら無理だろうな。GUIのように。

295:デフォルトの名無しさん
09/03/14 10:09:53
URLリンク(blade.nagaokaut.ac.jp)
最重要はコレ * メンテナは確保できるか

296:デフォルトの名無しさん
09/03/14 10:54:46
TMail でいいじゃん

297:デフォルトの名無しさん
09/03/14 11:42:35
>>296
脊髄反射乙

298:デフォルトの名無しさん
09/03/14 12:08:23
質問

クラスファイルの中に、いい例が思いつかないんですがたとえば

%w(hoge hage mage).each do |param|
eval("def get_#{param}; @#{param}; end")
eval("def set_#{param}=(v); @#{param}=v; end")
end

のように、全く動的でない固定の5個くらいの文字列から20個くらいメソッドを作る処理を書くのって無駄ですよね?
メソッドを書くスクリプトの処理結果をベタ張りするべきですよね?
RDocにも拾ってもらえないしいいとこなしですよね?

299:デフォルトの名無しさん
09/03/14 12:24:43
そいや、sqlite3-rubyは最近開発者が燃え尽きた(burned out)ような。
weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye

300:デフォルトの名無しさん
09/03/14 13:25:12
>>298
それが規約や共通処理的なものであるならプロジェクトに
よっては意味があるかもしれない
元の処理が何故そう書かれたのかを確認すればいいだけの話じゃないの?

301:デフォルトの名無しさん
09/03/14 14:16:13
>>294
少しはPythonを見習って欲しいな

>>299
丁度いい機会だから、SQLiteくらいは組み込んで欲しいよな
誰がメンテしてくれるのかは、知らないが・・・

Railsとかどうなるんだろう?最悪引き取ってくれるのかな?

302:デフォルトの名無しさん
09/03/14 14:37:40
JRubyでJavaのオブジェクトを明示的にキャストするにはどうしたらいいんでしょうか?
具体的にはGraphics型をGraphics2D型にダウンキャストしたいです。

303:302
09/03/14 16:13:30
すみません、自己解決しました。
JRubyでは内部的にSunGraphics2D型になっているようでした。

#僕自身は解決したんですが、JRubyの型指定ってどういう風にやってるんですかね。
#Javaは素人なんですが、明示的に型指定できなくても(Java側で)困る状況にならないってことなのかな。

それと、JRubyの質問ってここでしても良かったんでしょうか?
スレ違いだったなら申し訳ないです。


304:デフォルトの名無しさん
09/03/14 17:36:53
Class ClassA
def initialize
b = ClassB.new
c = ClassC.new
end
end

Class ClassD
def initialize
e = ClassE.new
c = ClassC.new
end
end

a = ClassA.new
d = ClassD.new

if (何か)
n = a.b
else
n = d.b
end


このような状態で、nを使ってcにアクセスするにはどうすればよいでしょうか?

305:デフォルトの名無しさん
09/03/14 17:43:00
ミスとインデントを修正しました。すみません

Class ClassA
 def initialize
  b = ClassB.new
  c = ClassC.new
 end
end

Class ClassD
 def initialize
  e = ClassE.new
  c = ClassC.new
 end
end

a = ClassA.new
d = ClassD.new

if (何か)
 n = a.b
else
 n = d.e
end


306:デフォルトの名無しさん
09/03/14 17:48:24
>>305
一般的に、a や d を持って来るべき

hoge(v)
# v は n であり、n から c を呼び出して何かする
end
hoge(n)

ではなく

hoge(v, n)
 …
end
hoge(a, n) または hoge(b, n)

または

hoge(v)
 # n = v.b または n = v.e
 …
end
hoge(a) または hoge(b)

という構造にすることを真っ先に考えるべき

307:デフォルトの名無しさん
09/03/14 18:10:59
私もそれがベストだとは思うのですが…
>>305から
c = ClassC.new を行っている2行を除いたのが元の状態で
それに手を加えて c = ClassC.new の追加と、nからの参照をしたい、という状況です

他が色々出来上がってしまっているので
hoge(v)をhoge(v, n)に修正するのは1から作り直すのと同じような状態です


308:デフォルトの名無しさん
09/03/14 18:22:03
あまりスマートではないけど、
Class[B,C,E]にルートオブジェクトを示す変数を入れて、
ルート側のinitializeで初期化するようにしたらどう?

309:デフォルトの名無しさん
09/03/14 18:25:40
ありがとうございます。
ひとまずそれでやってみます。

310:デフォルトの名無しさん
09/03/14 18:26:17
相互参照にする
b = a.b
c = b.a.c

クラス B E に C への参照を持たせる
c = a.b.c

可変引数を使う
def hoge(*args)
 case args.size
 when 1 ...
 when 2 ...

311:デフォルトの名無しさん
09/03/14 19:28:50
質問させてください。
以下のようなコードを書いたのですが、

File::open(ARGV[0], "r") { |f|
f.each {|line| print line }
}

このコードに
・このプログラムの実行時に引数がなかった場合(ARGV[0]がnilだった場合)に適切なエラーメッセージを標準入力に表示させる処理
・ファイルオープンに失敗した場合に適切なエラーメッセージを標準入力に表示させる処理
の二つを加えたいのですが、ruby的に一番スマートな書き方を教えていただきたいのです。
ifとかelseとかを多用するのはruby的には美しくないのかな?と・・・

ご教示頂けると嬉しいです。

312:デフォルトの名無しさん
09/03/14 19:31:21
勝手にしろ

313:デフォルトの名無しさん
09/03/14 19:39:41
> 標準入力に表示させる処理

かなり高難易度な気がする・・・

314:デフォルトの名無しさん
09/03/14 19:40:17
例外をキャッチキャッチキャッチして
スタンダードエラーアウトプットにプットプットプット!!!!

315:311
09/03/14 19:54:35
すいません間違えました。標準出力です。

316:デフォルトの名無しさん
09/03/14 20:09:12
>>312がFAではある

raise "引数を指定してください" unless ARGV[0]
begin
File::open(ARGV[0], "r") { |f|
f.each {|line| print line }
}
rescue Errno::ENOENT => ex
raise "#{ARGV[0]} が存在しません"
end

基本はこんなんだと思う
あとは好きに改造なり省略なりしれ

317:デフォルトの名無しさん
09/03/14 20:16:35
あ、最初の例外は ArgumentError であるべきという話もあるが好きにしてくれ

raise(ArgumentError, "引数を指定してください") unless ARGV[0]

RuntimeError 以外の例外は「第三者がrescueするかどうか」でとりあえず決めていい
誰も rescue しない例外で自作例外クラスを作ったりするのは自己満足以外の何物でもない

318:デフォルトの名無しさん
09/03/14 23:47:02
>>311程度の条件なら例外で振り分けることも出来る(おすすめはしない)
begin
 open(ARGV.fetch(0),'r') {|f| ... }
rescue IndexError # ARGV[0]がnil
 puts "引数を指定してください"
rescue # その他ファイル周辺の例外
 puts $!
end

rubyに限らずオブジェクト指向言語なら多態性を利用する事で
制御構造部分の記述を削減できるけど、311に適用出来る所はないね
普通にif文使って事前チェックをするのが正しいと思う

319:デフォルトの名無しさん
09/03/14 23:59:09
>>311
コマンドライン引数の処理はoptparse使え、常考。
URLリンク(www.ruby-lang.org)

320:デフォルトの名無しさん
09/03/15 03:20:31
折角だからWindowsXPに1.91を入れようと思っているんですが、
ワンクリックでインストールできるRubyとかないんでしょうか。
コンパイルとかできんし。

321:デフォルトの名無しさん
09/03/15 05:41:50
>>320
ワンクリックとはいかないが1.9.1のバイナリならこの辺
URLリンク(www.artonx.org)
URLリンク(www.garbagecollect.jp)

322:デフォルトの名無しさん
09/03/15 07:00:27
>>319
引数を受け取るだけの仕事にoptparseを持ち出すのはただの馬鹿

323:デフォルトの名無しさん
09/03/15 09:52:13
>>321
どうもです。早速試してみます。楽しみ楽しみ。

324:デフォルトの名無しさん
09/03/15 12:57:21
class G
 attr_accessor :a
 def initialize
  @a = []
  @m = M.new(@a)
  @a = [5]
 end
end

class M
 def initialize(a)
  @b = a
 end
 def output
  p @b
 end
end

g = G.new
g.m.output

このプログラムの結果は 5 ですよね?
その後 g.a を変えると output の結果も変わると思います
ところが g = G.new から g.m.output の間に
何をしているのかよくわからないんですが色々な処理が挟まっていて
g.a を変化させても(変化しているのに)結果が 5 のままになっています

間でどのような処理が行われている可能性があるんでしょうか?

325:デフォルトの名無しさん
09/03/15 13:02:41
>>324
> このプログラムの結果は 5 ですよね?
rubytest.rb:20: undefined method `m' for #<G:0xb7c4e638 @m=#<M:0xb7c4e598 @b=[]>, @a=[5]> (NoMethodError)

空気を読んで G の attr_accessor に :m を追加した結果

[]



326:デフォルトの名無しさん
09/03/15 13:11:46
簡略化したつもりが間違ってたみたいです
すみませんでした

どこがどうなってるんだろう…

327:デフォルトの名無しさん
09/03/15 13:11:49
前回書こうと思って面倒になって消したんだが、Rubyの変数は名札だ
メソッドが普段直接参照してるのは、変数の名前ではなく、オブジェクトID
変数はオブジェクトIDをわかりやすく書き手とメソッドに伝える名札に過ぎない

  @a = []
  @m = M.new(@a)
  @a = [5]

は、
「@a が [] になって M.new の引数に渡されて、さらに [5] に変化した(ので M.newに渡したものも [5] になっている)」
と見るのではなく
「[] というオブジェクトを @a という名前で呼ぶ、
 @a という名前のついたオブジェクトを M.new に渡す、
 [5] という(先の [] とは別物の)オブジェクトを @a という名前で呼ぶ」
と見るのが正しい

ということで、やりたいことは

  @a = []
  @m = M.new(@a)
  @a.push(5)

とすればいい
これなら @a は最初から最後まで同じオブジェクトを指すことができる

328:デフォルトの名無しさん
09/03/15 13:21:22
class G
def initialize
@a = []
p @a.object_id
@a.push(5)
p @a.object_id
@a = [5]
p @a.object_id
end
end
G.new

結果

-605095318 (最初)
-605095318 (同じ)
-605095348 (違う)

@a = で2度目の代入が行われた時点で、 1回目で [] だったオブジェクトを@a という名前で使うことはできない

329:デフォルトの名無しさん
09/03/15 13:22:18
>>325>>327>>328
ありがとうございます
おかげで少し理解できてきました

>>324の @a = [5] はこっちに書くときのミスで実際は @a[0] = 5 でした
これなら出力も 5 になると思います
そして>>324の質問の答えは『@aの参照先が変わる処理が行われた』ですね

再び質問なんですが、@aの参照先が変わろうとも、常に@aと同じものを参照する変数を用意する事はできますか?

330:デフォルトの名無しさん
09/03/15 13:31:20
変数とはデータを入れる箱である、というメタファーは Ruby では完全に誤りで誤解の元
箱ごと移動できそうに見えてしまうからね
オブジェクトが厳然と存在していて、それに補助的にぺたっとつくのが変数という名前のラベル

a = []
b = a
c = b
d = c

は、
「d の中に c があってその中に b が、 その中に a があってそれの中に [] という空の配列データが入ってる」
という状態ではなく
「配列オブジェクト [] に、変数名ラベルの a、b、c、d がぺたぺた貼られていてどの名前を使っても参照できる」
という状態

>>329
参照先が変わって困るような変数の場合はその名前を使い回してはいけない
オブジェクトには複数の変数名を持たせることができるから、適当な別名をつければどうとでもなるよ

331:デフォルトの名無しさん
09/03/15 13:38:24
@a = 初期値
b = @a
@a = 別な値
p b #=> 初期値

> 参照先が変わって困るような変数の場合はその名前を使い回してはいけない
が正しいな
@a をあとで使うのなら、@c = 別な値 とでもすべき
本来のスクリプトでどういう構造になってるかにもよるから、別にいいんだが

332:デフォルトの名無しさん
09/03/15 13:38:36
>>322
うるせー馬鹿
引数にオプション渡されたらどうするんだよハゲ
適切なエラーメッセージを出したいって言ってるだろう?
あと、vやhオプションを実装しろっていう暗黙の命令

333:デフォルトの名無しさん
09/03/15 13:41:21
>>330>>331
わかりました
詳しい説明ありがとうございました

334:デフォルトの名無しさん
09/03/15 13:41:59
> このリファレンスマニュアルは、Ruby 1.9 に関して、言語仕様、組み込みライブラリ、
> 標準添付ライブラリのいずれにもまったく対応していません。信用してはいけません。

(´,_ゝ`)プッ

335:デフォルトの名無しさん
09/03/15 13:44:18
>>334
文句あるならオフィシャルのマニュアル使って下さい

336:デフォルトの名無しさん
09/03/15 13:48:58
> 執筆者募集中

(´,_ゝ`)プッ

337:デフォルトの名無しさん
09/03/15 15:06:30
        ∧_∧
  (⌒⌒ヽ ( ・ω・)  あ、ワリ、屁こいちゃった
 (  プッ!! ゝ∪   )
  丶〜 '´  (___)__)

338:デフォルトの名無しさん
09/03/15 15:27:29
1.9って思いきって名前変えれば良かったのにな。
ruby vista 1.0とか。

339:デフォルトの名無しさん
09/03/15 15:29:08
それは 2.0 の役目です
1.9 シリーズはただの橋頭堡

340:デフォルトの名無しさん
09/03/15 16:40:53
1.10は?

341:デフォルトの名無しさん
09/03/15 17:15:56
>>339
橋頭堡というか里程標というか

342:デフォルトの名無しさん
09/03/15 23:47:47
誰か教えて

f(a,b) = a^b
但し a, b は実数 (実際は有限桁です)

を100桁ぐらいの精度で出したいんだけどどうすればいいですか?
bigdecimalとか使ってもうまくいかない

343:デフォルトの名無しさん
09/03/15 23:56:52
「うまくいかない」なら「しかたがない」だろ

344:デフォルトの名無しさん
09/03/16 00:03:47
まず自分がどうやって、
どううまくいかなかったか書かなきゃダメだろ

345:デフォルトの名無しさん
09/03/16 02:49:37
そもそもその精度に意味が有るのか検証したほうが。
つ有効桁数

346:デフォルトの名無しさん
09/03/16 07:14:52
ちょっと解釈がわからないところがあるので質問させてください。

以下のようなコードを実行した場合

$KCODE = 'n'
print 'あいう'.match(/\W+/), "\n" #結果 => あいう
$KCODE = 's'
print 'あいう'.match(/\W+/), "\n" #結果 => nil

右のコメントにあるような結果になってしまうのですが
これはどういう事なんでしょうか?
マルチバイト文字を認識可能にすると
何故正規表現の「\W」が機能しなくなるのでしょうか?
$KCODE='n'の時に「\W」が機能しないという逆の状態なら納得できるのですが…

347:デフォルトの名無しさん
09/03/16 07:30:35
>>346
\w の意味は? \W はその補集合だよな? な?

348:デフォルトの名無しさん
09/03/16 07:41:37
>>347
やっと意味がわかりました。

文字コードを指定する事でマルチバイト文字も
「\W」の認識形式に含まれるという事ですね。
文字コードを指定した場合の「\W」は
「英数文字+マルチバイト文字『以外』の文字」という事になるのですね。
つまりそこに引っ掛かる文字は主に「記号」になると。

この認識でいいですか?

349:訂正
09/03/16 07:43:07
× 「\W」の認識形式に含まれるという事ですね。
○ 「\w」の認識形式に含まれるという事ですね。

350:デフォルトの名無しさん
09/03/16 09:13:48
>>342
1.23**4.56 => 2.5702023016193 <----これでは足りないという事なら
123**456 => (ry
↑の結果をMath.logを使って元の値を求める。

351:デフォルトの名無しさん
09/03/16 09:40:15
>>348
\w は「単語構成文字」
何を単語を構成する文字とみなすかは文脈によって変わるってこと


352:デフォルトの名無しさん
09/03/16 09:45:01
>>348
「詳説 正規表現」っていう本を読んでみるといいお

353:デフォルトの名無しさん
09/03/16 09:48:32
irb> puts 'あいう'.tosjis.inspect
"\202\240\202\242\202\244"
irb> puts 'あいう'.tosjis.match(/\W/n).inspect
#<MatchData "\202">
irb> puts 'あいう'.tosjis.match(/\W/s).inspect
nil
irb> puts 'あいう'.tosjis.match(/\w/s).inspect
#<MatchData "\202\240">


354:デフォルトの名無しさん
09/03/16 09:57:02
正規表現は関係なくて、日本語マルチバイト文字とはなんぞやという話だな

puts '表示'.tosjis.match(/\w/s).inspect
#<MatchData "\225\\">

355:デフォルトの名無しさん
09/03/16 17:15:40
nitems って何の略ですか?

nil items?

356:デフォルトの名無しさん
09/03/16 17:18:06
number of items だと思う。
ていうかどういう場所に現れたのかわからないと答えようがない。

357:デフォルトの名無しさん
09/03/16 17:30:33
Array#nitems なら Number of ITEMS で項目数
Ruby 1.9 では無くなったメソッドだ
nitem という言葉自体はプログラミングでは一般的な略語で項目数を表す

358:355
09/03/16 17:42:13
>>356-357
ありがと!
そうか、1.9 ではなくなったんですね。

359:デフォルトの名無しさん
09/03/16 18:59:04
こんなとき、nitem いいですか。

360:デフォルトの名無しさん
09/03/16 19:01:24
好きなだけ nitem いいよ

361:デフォルトの名無しさん
09/03/16 20:15:18
ここは nitem 持っとかないと

362:311
09/03/16 20:26:10
レスありがとうございます。参考にさせて頂きます。m(_ _)m

363:じゃなくて311
09/03/16 20:27:51
レスありがとうございます。参考にさせて頂きます。m(_ _)m


364:デフォルトの名無しさん
09/03/17 16:11:43
少しお聞きします。
文字列が空文字列(nilではない)かどうか?を調べる一般的な方法(定石、慣例)というのはないのでしょうか?

例:
s = ""
do_hoge if s != ""

こんなんでいいの?if s だと駄目みたいだし。(""はRubyではfalseにならない)

365:デフォルトの名無しさん
09/03/17 16:19:25
>>364
String#empty? ってのがある。

366:デフォルトの名無しさん
09/03/17 16:22:13
通常の処理 unless str.empty?

if str.empty? then 何かエラー処理 end

というのがイディオム的ではある

367:デフォルトの名無しさん
09/03/17 16:50:20
str が nil のときでも str.empty? は呼べますか?

368:デフォルトの名無しさん
09/03/17 16:52:41
$ ruby -e 'str = nil ; str.empty?'
-e:1: undefined method `empty?' for nil:NilClass (NoMethodError)

369:デフォルトの名無しさん
09/03/17 16:54:26
>>367
あ、そうか
str が nil である可能性が幾ばくかでもある場合は

str && !str.empty?

とか書く
途端にめんどくさい感じになって、俺はあまり好きではない

370:デフォルトの名無しさん
09/03/17 16:58:55
>>369
「nil を empty と同一視したいとき」だな
nil は 0 や "" と違う扱いを受けるべき



というのが理想論

371:デフォルトの名無しさん
09/03/17 17:04:16
どうせ俺専用スクリプトだ!てことで

class NilClass
def empty?
true
end
end

とかって邪道?

372:デフォルトの名無しさん
09/03/17 17:08:57
>>371
駄目

373:デフォルトの名無しさん
09/03/17 17:17:19
RailsならObject#blank?

374:デフォルトの名無しさん
09/03/17 17:20:16
組み込みクラスの拡張は、既存の動作に影響を及ぼさない限りにおいてのみ是
str.empty? が NoMethodError で例外を出して終了することを前提にしているライブラリがうまく動作しなくなるから、
>>371は「やってはならない」

というか、is_empty? とかそういう関数的メソッドを定義したほうがなんぼか素直だと思われる

375:デフォルトの名無しさん
09/03/17 17:28:09
>>369
なんかそれキモイw

str.nil? or str.empty?

376:371
09/03/17 17:46:47
なるほど、ためになりました。

377:デフォルトの名無しさん
09/03/17 21:41:00
Object#tryは正式採用されるだろうか。


378:デフォルトの名無しさん
09/03/18 00:49:36
nil には nil? があって
すべての object にも nil? があるのですね

379:デフォルトの名無しさん
09/03/18 00:57:31
NilClassを含む全ての基底クラスであるObjectのメソッドだしねぇ

380:デフォルトの名無しさん
09/03/18 01:01:29
と書いてふと思った。
「一切の例外なくObjectを継承してる」と断言していいんだっけ?

381:デフォルトの名無しさん
09/03/18 01:03:05
つ BasicObject (1.9)


382:デフォルトの名無しさん
09/03/18 01:03:43
BasicObjectが出来たので駄目

383:デフォルトの名無しさん
09/03/18 01:05:58
>>380
1.8ではOK

384:デフォルトの名無しさん
09/03/18 01:15:15
なんぞそれw
調べてみるサンクス

385:デフォルトの名無しさん
09/03/18 01:33:52
URLリンク(doc.loveruby.net)
説明としてはこのへんかね。



386:デフォルトの名無しさん
09/03/18 03:03:54
なんでそんなひどいことしたの

387:デフォルトの名無しさん
09/03/18 03:07:17
>>386
>通常のクラスは Object またはその他の適切なクラスから派生すべきです。
>真に必要な場合にだけ BasicObject から派生してください。

基本的に使うなってことだから大丈夫

388:デフォルトの名無しさん
09/03/18 04:30:12
でもあるから使っちゃえで、どうにも成らなくなる気がする。

389:デフォルトの名無しさん
09/03/18 04:40:02
ActiveSupportあたりがメソッドもりもり追加しそう

390:デフォルトの名無しさん
09/03/18 04:41:17
Objectに追加すべき

391:デフォルトの名無しさん
09/03/18 04:42:07
数年後にSuperBaseObjectが出来るんですねわかります

392:デフォルトの名無しさん
09/03/18 08:15:56
というか、わざわざBasicObjectを選んでメソッドを追加するメリットは特にない

393:デフォルトの名無しさん
09/03/18 08:19:36
BasicObjectは、Objectに定義されているメソッドがundefでも動作に邪魔だという場合に使う

394:デフォルトの名無しさん
09/03/18 08:46:27
BasicObject継承してなにかするのは面倒だから
気軽に使えるモノではない。

当たり前だが、インスタンス作るだけで
irb> BasicObject.new
NoMethodError: undefined method `inspect' for #<BasicObject 0x3e40cc>
なんだぜ。



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5390日前に更新/120 KB
担当:undef