トップページ⇒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
0253デフォルトの名無しさん2006/12/03(日) 12:29:01
げ、0.blank? は偽だった。
0254デフォルトの名無しさん2006/12/03(日) 16:42:22
すいません。
ミニゲームを作ってHPで公開してみんなに遊んでもらう
(javaアプレットのような。)にはどうしたら良いのでしょうか。
0255デフォルトの名無しさん2006/12/03(日) 16:48:50
勉強すればいいと思う。
「javaアプレットのような」はほぼ不可能。
02562542006/12/03(日) 16:53:52
そうなんですか?
いっそjavaに乗り換えたほうが楽なのか…
ありがとうございます。
0257デフォルトの名無しさん2006/12/04(月) 10:23:11
213の続きです。CSV::to_a.sizeが一番シンプルでスマートのようです。
ところで,to_a,メソッドの振る舞いですが
#!/usr/local/bin/ruby
require 'csv'
outfile = File.open('csvout', 'wb')
CSV::Writer.generate(outfile) do |csv|
csv << ['c1', nil, '', '"', "\r\n", 'c2']
end
outfile.close
csv = CSV.open("csvout", "rb")
p csv.to_a #1->[["c1", nil, "", "\"", "\r\n", "c2"]]
p csv.to_a #2->[]
csv.close
上記のように変わってしまいます。これはそんなものなのですか?
「!』がついていないので,変化しないと思っていたのですが,知らないとうっかりしそうです。
0258デフォルトの名無しさん2006/12/04(月) 12:48:14
そのcsvはFile(IO)のインスタンスなので、to_aはファイルを全部読んで配列にして返す。次の呼び出しではファイル末尾にいるので、空になる。
0259デフォルトの名無しさん2006/12/04(月) 15:27:21
>>251
正確には hash.key?('key') || hash['key'].empty? だけど
このばあいだったらHash#fetch()を使って hash.fetch('key', '').empty?
(ただし hash['key'] == nil ならエラーになるかな)
いちばんいいのは
def nil.empty?; true; end
hash['key'].empty? # nilか空文字列ならtrue

nil.empty? は標準化してほしい。
0260デフォルトの名無しさん2006/12/04(月) 21:05:01
HTMLコーダーですがイントラネット内で使用する小ツールを作ることになりました。
Rubyを習得して作りたいと思っているのですが、
以下のようなアプリをRuby作ることは難しいでしょうか(向いているでしょうか)?

・作りたいもの
HTMLで作られたフォーム部品を選択、もしくは入力して実行ボタンを押すと
入力した内容に沿った形式の帳票を印刷する。(帳票の形式は複数ある)
また、印刷履歴を管理し、ブラウザで参照できるようにする。

・やりたいこと
IE6上で動作し、インターフェイスと処理結果はHTMLとCSSで作る。
データ形式はXMLで値の取出しにはXPathを使う。

・制限
サーバに何かプログラム(例えばApacheなど)をインストールすることは許可されていない。
できればクライアントにも特別何かを導入したくない。(WindowsXP+IE6+ネットワークがあれば実行できるようにしたい)
クライアントの環境はWindowsXP+IE6のみ。その他の環境は考慮しなくてOK。


以上になります。
0261デフォルトの名無しさん2006/12/04(月) 21:10:45
>>260
> サーバに何かプログラム(例えばApacheなど)をインストールすることは許可されていない。
この時点で、ほぼ何も出来ないんだけど。
鯖にはRubyがインストールされていて、CGIとかで動かすことができるの?
鯖スペック詳しく。

> WindowsXP+IE6+ネットワークがあれば実行できるようにしたい
Rubyはどこで動きますか?電子の海で?

HTML+CSSで帳票ってあまり向かないような気がするんだけど大丈夫?
# 日本の帳票は変態仕様が多い

帳票のための入力データはどこから来ますか?
もしXMLなのであれば、XSLTで変換してやればおしまいのような気がするけどどう?
02622602006/12/04(月) 21:40:46
>>261
サーバにRubyはインストールされていません。
Exerbというツールでスクリプトをexe形式にすれば
特別実行環境がなくても使えるようなので、
それを使いつつ、インターフェイスなどはIE6上でHTMLとCSSでできたら
効率的かなぁと考えたのですけれどもそんな虫のいいことはできないのでしょうか。

イメージ的には
1.イントラネット上の共有フォルダ上にあるexeを実行。
2.ブラウザが起動してフォームページが表示される。
3.フォームに必要事項を記入して実行。
4.帳票プレビューが表示される。
5.確認して印刷。

CSSならある程度使いこなせるので紙に合わせて作れると思います。
入力データはXMLです。
XPathでデータを取ってきてプログラムからHTMLを書くことを考えていましたが
ページ自体はXSLTで実現させることもできますね。気が付きませんでした。

HTML,CSS,XML,XSLTはそこそこわかるので積極的に利用しつつ
処理の部分でRubyを使っていきたいのですが上記のようなことはできないのでしょうか?
0263デフォルトの名無しさん2006/12/04(月) 21:41:28
>>260
VBAで印刷や入力補助を小細工したえくせるの帳簿ファイルを
Windowsネットワークの共有フォルダに置いてみんなに共有させる
0264デフォルトの名無しさん2006/12/04(月) 21:57:11
作れると思います、ではなく実際に作ってみてから言うんだな>CSSで帳簿
0265デフォルトの名無しさん2006/12/04(月) 22:05:51
net/httpを使ってホームページにアクセスするプログラムを作っているのですが
ページによってはCookieが有効でありませんと弾かれてしまう事があります。
これを解決できる良い方法は何かないでしょうか?
0266デフォルトの名無しさん2006/12/04(月) 22:13:39
クッキーのやりとりがどうやって行われているか調べればよいのでは?
etherealでもなんでもいいからパケット覗けばわかるっしょ。
0267デフォルトの名無しさん2006/12/04(月) 23:15:55
>>262
クライアントにexeを置くだけでは、それは無理。
IEを捨てて、アプリでなんとかするなら可能。
どちらにせよ、Rubyは不向き。
HTMLコーダのチミにも不向き。
0268デフォルトの名無しさん2006/12/05(火) 00:15:26
JScript or VBScript で HTA あたりを書いとくのが無難でないかい。

まぁ、ActiveScriptingRuby 使えば、Ruby でもできなくはないだろうが、
exerb 使えたっけ?あれ

 
0269デフォルトの名無しさん2006/12/05(火) 09:51:13
>>262
そういうアホな仕様の実現方法を考えるのは嫌いじゃないのだが考えられるのは
* ASRのHTA
* Webrickとかを使ってHTTPサーバとして動作するexeを作る
* WIN32OLEでなんとかする(フォームイベントがとれるかどうかが肝だが怪しい)
ぐらいか。
ブラウザだとHTAかHTTPしか手段がないからな。

>>268
1.8.4ならだいたい確実にできるらしい。
ttp://arton.hp.infoseek.co.jp/indexj.html
0270デフォルトの名無しさん2006/12/05(火) 10:25:52
>>269
仕様を素直に実現するなら、HTAを使うのが正解だと思うんだが、
その場合ActiveScriptEngineとしてのASRをインストールというか
登録する必要がある。
それは問題ないのかねえ?

もし俺がやるなら、2番目のWEBrickでHTTPサーバ立てる、を選ぶな。
楽だし。
0271デフォルトの名無しさん2006/12/05(火) 14:37:43
>>270
あーそりゃ問題だ。
無理。
実行時に必要なファイルだけインストールしちゃえばいいかも。
0272デフォルトの名無しさん2006/12/05(火) 17:42:22
>* Webrickとかを使ってHTTPサーバとして動作するexeを作る

これを詳しく教えてください。
0273デフォルトの名無しさん2006/12/05(火) 17:55:36
>>272
WEBrickを使ってHTTPサーバとして動作するスクリプトを作る。
そしてそれをExerbでexe化する。
以上。
0274デフォルトの名無しさん2006/12/05(火) 18:08:04
>>273
それはrailsでつくったアプリケーションでもできますか?
0275デフォルトの名無しさん2006/12/05(火) 18:53:03
>>274
やってる人はいるよ。
Rails製のデスクトップアプリを作った人がいる
0276デフォルトの名無しさん2006/12/05(火) 21:50:21
すまんが教えてくれ棒だす
WindowsXPでruby-1.6.8使っててnet/httpsを使いたいんだが
Netで探したhttpsサンプル動かそうとすると
uninitialized constant Net (NameError)
とエラーがでるんだよ。
でNet-1.2.0だかが必要なのかなと(あてずっぽで)思って
そいつを探してるんだけど、
これってNet上どこにあってPCのどこにおけばいいの?
それともそもそも大間違い?

サンプルコードはこれ
require 'net/https'
Net::HTTP.version_1_2
https = Net::HTTP.new( 'www.foo.var', 443 )
https.use_ssl = true
https.ca_file = '/ca-bundle.crt'
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
https.start { |w|
response = w.get('/')
puts response.body
}
0277デフォルトの名無しさん2006/12/05(火) 21:58:13
opensslとnet/httpsが追加されたのはruby 1.8.0からだな。
どっかに単独配布時代の落ちてればいいんだが、ミツカンネ。
頑張って探すかRubyのバージョン上げてくれい。
0278デフォルトの名無しさん2006/12/05(火) 22:00:05
>>276
1.8.5 使いなさい。
0279デフォルトの名無しさん2006/12/05(火) 22:00:36
http://www.nongnu.org/rubypki/
ここが単独時代の跡地らしいが、ダウンロードリンク切れになってるな。
02802762006/12/05(火) 22:30:38
277,278,279
ありがとう(号泣しそうです
にちゃんで久しぶりに親切な人たちを見た!お前ら大好き!
素直に1.8.Xにするずら
0281デフォルトの名無しさん2006/12/06(水) 08:17:37
Ruby始めて1年以上経つんですが、(日曜プログラマです。大学でJavaを軽くやった程度です)
1.ローカル変数、インスタンス変数、(あと、Classクラスのインスタンス変数ですか)、クラス変数のスコープが、
  複数ファイルにクラス定義が分割されてたり、
  クラスやモジュールがネストされた関係にあったり、
  後から特異的に定義されたりすると、何が何かわからなくなってしまいます。
  一応、自分なりに、色々動かして、こんな感じじゃないかなぁとは思うようになったんですが
2.このことを、動的言語っていうこととか、宣言文とか、
  そういう話も含めて、
  こういう原則というか、思想に基づくから、
  この変数は、ここまでがスコープなんだよとかいう風に
  説明してくれてるような、本とかドキュメントとかないでしょうか。
3.例としては、カプセル化したいから、publicとかprivateとかあって
  インスタンス変数は、元々privateなんだよ、というような説明があればいいんですが。

こういう理解は、C言語覚えて、ソース読まないといけないんでしょうか。。
それとも、アプローチの仕方が悪いんでしょうか。


読んだ本は以下の感じです。
たのしいRuby(1版)、
Rubyレシピブック
Ruby on Rails関連の本
0282デフォルトの名無しさん2006/12/06(水) 08:38:32
1.2.3.の使い方が意味わからない
0283デフォルトの名無しさん2006/12/06(水) 08:46:10
>>282
Excelでおk
0284デフォルトの名無しさん2006/12/06(水) 11:59:01
>>283
はいはいLotusLotus
0285デフォルトの名無しさん2006/12/06(水) 14:12:19
咲け〜輪廻のOh〜
0286デフォルトの名無しさん2006/12/06(水) 19:37:58
>>281
プログラミングRuby第二版言語編
初めてのプログラミング

この二冊は読んでおいて損はないはず
0287デフォルトの名無しさん2006/12/06(水) 23:12:05
cronからruby/tkスクリプトを動かしてwindowを開かせるには、どうすればいいんでしょう?
cronからwindowを開かせるには、例えば
xterm -display :0.0
のようにXサーバを指定しなければならないようですが、
その方法が分かりません。
0288デフォルトの名無しさん2006/12/06(水) 23:52:29
>>287
RubyよりもXの質問になるね。
DISPLAY環境変数exportしておけば?
あと xhostとかで使用許可を出しておかないとたぶん表示させてくれない。
0289デフォルトの名無しさん2006/12/07(木) 00:18:48
つーかcronからじゃどのDISPLAYに出したらいいか、
そもそもあるのかどうかすらわからんだろう。

~/.xsessionとか~/.xinitrcあたりで、時間がくるまで眠ってるプロセスでも
バックグラウンドで走らすとか。
0290デフォルトの名無しさん2006/12/07(木) 00:43:51
php5なんて誰も使ってないから
0291デフォルトの名無しさん2006/12/07(木) 18:08:09
>>281
こんなんもあった

http://www.ruby-lang.org/ja/man/?cmd=view;name=trap%3A%3A%A5%B9%A5%B3%A1%BC%A5%D7%A1%A2%C0%A9%B8%E6%B9%BD%C2%A4
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%A5%B9%A5%B3%A1%BC%A5%D7
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Ruby%A4%CE%B7%E7%C5%C0
http://shugo.net/jit/20050328.html
http://homepage1.nifty.com/~tetsu/ruby/tips/#var_scope
http://www.swlab.it.okayama-u.ac.jp/man/ruby/uguide/uguide22.html

http://wota.jp/ac/?date=20060309
http://idm.s9.xrea.com/ratio/2006/11/08/000535.html

このあたり読むと、わかるんじゃない??
0292デフォルトの名無しさん2006/12/08(金) 02:01:33
初心者すぎてすみません。

CSVのファイルを開いて

1,2,3,4
5,,3,6
2,,,3
↑このように保存されている

split使って
1
2
3
4
5

3
6
2


3

のように新しくCSVファイルを作りたいんですけど
どうやってやればいいですか?
すみません。。。
0293デフォルトの名無しさん2006/12/08(金) 02:40:25
>>292
まず、p を使ってスクリプト途中のデータの構造や状態を把握。把握したら適当に処理。
0294デフォルトの名無しさん2006/12/08(金) 02:55:30
宿題っぽいやかん
0295デフォルトの名無しさん2006/12/08(金) 03:00:22
これでいい?
puts File.read('csv').split(/,|\n/)
0296デフォルトの名無しさん2006/12/08(金) 03:30:26
宿題っぽい質問にはやらしい解法の回答しか返ってきません
0297デフォルトの名無しさん2006/12/08(金) 03:45:11
ちょっとくらい教えてあげればいいのに。
ケチやな。

まぁおれにはできないけど(爆
0298デフォルトの名無しさん2006/12/08(金) 04:48:30
どうやって新しく "CSV" ファイルを作るんだろう
0299デフォルトの名無しさん2006/12/08(金) 07:19:27
朝のお祈りを忘れなければできる
0300デフォルトの名無しさん2006/12/08(金) 10:03:29
>298
結果を新たに作った csv ファイルに書き込むんじゃないのか?
0301デフォルトの名無しさん2006/12/08(金) 13:04:20
でも csv っていうくらいだから(ry
0302デフォルトの名無しさん2006/12/08(金) 13:26:02
だよな・・・・
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
■ このスレッドは過去ログ倉庫に格納されています