Ruby初心者スレッド P ..
[2ch|▼Menu]
365:デフォルトの名無しさん
07/05/17 13:20:21
>>357
>>354のメソッド定義は、こう書いたのとほぼ同じ

class Hoge
def Hoge.a
return 1
end

def Hoge.hoge()
num = a
return num
end
end

obj = Hoge.hoge

つまりaとhogeは、両方ともクラスメソッド

>>359
ClassじゃなくてModule使うんじゃダメなの?

366:デフォルトの名無しさん
07/05/17 15:32:16
「インスタンスを作らせたくない」って異常だよな
自動でインスタンス作る機構でも入れてんだろか

367:デフォルトの名無しさん
07/05/17 15:37:46
別に異常ってことはないだろ。
てかJava知らん奴が無駄に突っかかるなと。

368:デフォルトの名無しさん
07/05/17 16:07:32
GoF4のデザインパターンまわりにインスタンスを作らせたくない
ケースはごろごろありそうだけど。

369:デフォルトの名無しさん
07/05/17 16:47:00
要するにJavaの言語仕様上の要求から出て来るだけで、Rubyだとほとんど意味
をなさないパターンだな。

一応singleton.rbというのもあるけど。


370:デフォルトの名無しさん
07/05/17 16:50:04
どちらにせよ359の目的が分からんとなんとも言えん

371:デフォルトの名無しさん
07/05/17 19:30:47
Windows環境で スクリプト中に ディレクトリ名などを含めたいとき
ディレクトリ区切り記号が バックスラッシュなので
たとえば
path = "c:\\tmp\\"
のように \\ふたつ重ねで 書く必要がある
あるいは
path = "c:/tmp/"
のように バックスラッシュの代わりに スラッシュに置き換える必要がある.
…でも
私の場合, こういったパス名は ほとんどの場合, Explolerから コピペしてくるので
長いパス名だと \ を 間違えないように \\ とか / に置き換えるのが面倒だし
第一, 見た目にも \だらけで やさしくない.
C# みたいに @"c:\tmp" って書けるような 文字列リテラル書式って
ないんでしょうか?

372:デフォルトの名無しさん
07/05/17 19:31:00
作らせないってどういう時に使うんですか?

シングルトンとか?
あとは、Factoryを介してほしいときとかかな?

373:デフォルトの名無しさん
07/05/17 19:32:31
>>371
%q(c:\hoge\mage)
ではダメですかね?

374:matz
07/05/17 19:33:47
Windowsのような糞OSのための特殊仕様なんてありませんし

   あ り え ま せ ん 



375:デフォルトの名無しさん
07/05/17 19:40:25
>>373
ちょっとやってみると…
%q(c:\tmp\)
では エラーでした.
%q は すべてのバックスラッシュ記法を無効にするというわけでは
ないみたいですね


376:デフォルトの名無しさん
07/05/17 20:29:07
>>375
%q(c:¥tmp)
なら問題ないかと

377:デフォルトの名無しさん
07/05/17 21:24:32
>>376
そうですね.
調べてみると…

シングルクォート or %q 記法では ほとんどのバックスラッシュは そのまま書けるけど
文字列の最後だけは エスケープの必要があるようです.

ちなみに…私がpath名の最後に \ をつけたいのは
見てすぐ ディレクトリ名だと思う …ってのと
後で ファイル名を くっつける時に楽だから…という理由で, わりとよくつけるのでした.
まぁ これくらは 慣れでなんとかやっていけそうです.

以上, ありがとうございました>コメントくれた人々


378:デフォルトの名無しさん
07/05/17 21:43:08
>文字列の最後だけは エスケープの必要があるようです.
じゃなくて、「'」とか「)」とかの文字列閉じるやつを
バックスラッシュがエスケープするからだと思われ
unterminated string meets end of fileって叱られたし

379:デフォルトの名無しさん
07/05/19 01:22:40
["a", "b", "a", "c"] から ["a", "b", "c"]を得たいのですけども、
Array#uniq じゃダメですよね。
どうするのが手軽で良いでしょうか。

380:MoonWolf ◆MoonWdLnkQ
07/05/19 01:41:33
["a", "b", "a", "c"].uniq.sortでいいんじゃない?


381:デフォルトの名無しさん
07/05/19 01:43:16
uniqでよい

ただ、おそらくは例が悪くて

irb> arr = ["c", "b", "a", "a"]
=> ["c", "b", "a", "a"]
irb> arr.uniq
=> ["c", "b", "a"]

これを一発で ["a", "b", "c"] にしたいという話だと推測
適当に sort するしかないな

ref = ['北海道', '青森', '秋田', '岩手'] # 順番を記述した配列
arr = ['青森', '岩手', '北海道', '北海道', '秋田'] # 整頓したい配列
puts arr.uniq.sort_by{|a| ref.index(a)}

北海道
青森
秋田
岩手


382:デフォルトの名無しさん
07/05/19 01:58:04
今ふっと思ったんだけど、puts [1,2,3,4]って
1234

であるべきじゃね?
1
2
3
4

になってる現状っておかしくね?
なんで配列の場合だけ配列を生かして印字するん?
ハッシュは前者のように印字するのに。

383:MoonWolf ◆MoonWdLnkQ
07/05/19 02:05:30
>>382
to_sの結果と違うから、ちょっと困るね。
ハッシュをputsした場合、キーの順序が不定になってうまく動かない気が。。。


384:デフォルトの名無しさん
07/05/19 02:09:55
>>382
だいぶ前に開発版で一瞬だけ前者のようになったことがあり
URLリンク(blade.nagaokaut.ac.jp)
速攻で元に戻った

配列の場合だけ特別にやってるみたい
ごく初期の便利機能っぽい雰囲気が残ってる
「join("\n")しなくてもputs単体でもイケます」みたいな

.join("\n") の11文字タイプするのすら面倒な書き捨てスクリプトでない限り
よい子はこれに頼らないほうがよいかと…

385:デフォルトの名無しさん
07/05/19 02:36:38
.join("\n") より *"\n" を選ぶオレはgolf脳。
もちろん \n は生の改行文字に置き換えます。

386:デフォルトの名無しさん
07/05/19 02:40:08
puts(*ary)

387:デフォルトの名無しさん
07/05/19 02:57:17
>>385
そんなん初めて知った

388:デフォルトの名無しさん
07/05/19 08:41:54
>>385
できた。すげえ

389:デフォルトの名無しさん
07/05/19 08:57:18
>>386
なるへそ
となると、putsの便利機能とやらは、もはやほとんど不必要なわけか

390:デフォルトの名無しさん
07/05/19 09:24:47
puts(nil) の特別扱いも要らないよなぁ

391:MoonWolf ◆MoonWdLnkQ
07/05/19 10:54:10
"\n"よりも$/のほうが短くね?


392:デフォルトの名無しさん
07/05/19 11:02:19
一行目しか読めねぇのかよこのデブが!

393:デフォルトの名無しさん
07/05/19 11:04:06
配列のタプルへの変換は常識

394:デフォルトの名無しさん
07/05/19 11:34:38
タプタプするとか言うな殺すぞデブ!

395:デフォルトの名無しさん
07/05/19 11:35:56
んでタプルって何?

396:デフォルトの名無しさん
07/05/19 11:43:45
マニュアルの Rinda::Tuple には…書いてないな

397:MoonWolf ◆MoonWdLnkQ
07/05/19 12:00:14
>>392
>>391のこと?
\nを生の改行コードにしても3バイトだよね。
$/なら2バイトだよ。
改行コードが\r\nでもうまく動くから$/のほうがいいな。


398:デフォルトの名無しさん
07/05/19 13:00:18
>\nを生の改行コードにしても3バイトだよね。
>$/なら2バイトだよ

\n も $/ どちらも2バイトなような気がする…
生の改行コード、がわからない orz

399:デフォルトの名無しさん
07/05/19 16:10:59
"改行
"
で3バイトってことかな。


400:デフォルトの名無しさん
07/05/19 16:11:43
その伝だと、"¥n"は " ¥ n " で4バイトだね。

401:デフォルトの名無しさん
07/05/19 16:17:01
引用符なしで直接 \n って書いたら、"\n"のことだと見なしてくれたら便利だな

402:デフォルトの名無しさん
07/05/19 16:22:50
お前は puts の話でいったい何を得たんだ(w

403:デフォルトの名無しさん
07/05/19 16:29:35
最後に改行が付いてる文字列を puts したら
改行 1 個しか出力されない仕様はどうかと思うんだ。

404:デフォルトの名無しさん
07/05/19 16:32:29
>>403
puts は「適当に改行を補って表示する」メソッドです(chomp が適当に改行取るのと似たような感じ)
常に改行を補いたい場合は print str + "\n" と明示的に書いてください

というのはどうだろう

405:デフォルトの名無しさん
07/05/19 16:35:48
ファイルにputsしたら駄目だよな
putsは入力と出力が必ずしも一致しない

putsは再現度の重要度の低い画面表示向け

406:デフォルトの名無しさん
07/05/19 16:51:04
Ruby2.0ではputs a, b, cで改行無しにくっつけて表示してもらいたい

407:デフォルトの名無しさん
07/05/19 16:59:45
>>406
print使え

408:デフォルトの名無しさん
07/05/19 18:38:18
>>403

実際にやってみたけど普通に改行2つでるよ?
何か勘違いしてるのかなぁ。

str = "hoge\n"
puts str

----

409:デフォルトの名無しさん
07/05/19 18:40:27
>>408

410:デフォルトの名無しさん
07/05/19 18:52:53
試験の要件を満たすプログラムを作成できるようになるための勉強ってやっぱ必要だよな

print "---------------------\n"
str = "改行なし"
puts str
print "---------------------\n"
str = "改行あり\n"
puts str
print "---------------------\n"


411:デフォルトの名無しさん
07/05/19 20:15:47
>>403
げ、本当だw

> ruby -e 'puts "str"'
str
> ruby -e 'puts "str\n"'
str
>

412:デフォルトの名無しさん
07/05/19 20:28:43
これも「どんな文末でも必ず改行つきで表示する」ならそれはそれでいいんだけどな

$ ruby -e 'puts "str"' | cat -n
1 str
$ ruby -e 'puts "str\n"' | cat -n
1 str
$ ruby -e 'puts "str\n\n"' | cat -n
1 str
2
$ ruby -e 'puts "str\n\n\n"' | cat -n
1 str
2
3

機械的に1回chompしてるだけじゃねーか(w

413:デフォルトの名無しさん
07/05/19 20:57:30 BE:199851124-2BP(0)
rubyで配列に対して同じものが何回出たか一言で数える方法ってありますか?
uniq -c みたいな

414:デフォルトの名無しさん
07/05/19 21:11:04
a=[1,1,2,2,3]; a.size - a.uniq.size

こんな感じ?

415:デフォルトの名無しさん
07/05/19 21:22:37
arr=[1,2,2,3,3,3,4,4,4,4]

arr.uniq.each do |e|
same_elements = arr.find_all{|e2| e == e2}
puts "#{e}は#{same_elements.size}回"
end

-------------

1は1回
2は2回
3は3回
4は4回

こんなん?

416:デフォルトの名無しさん
07/05/19 22:08:39
a.inject(Hash.new(0)) { |hash, e| hash[e] += 1; h}

なんかでじゃぶを感じる。


417:デフォルトの名無しさん
07/05/19 22:09:30
× h
○ hash


418:デフォルトの名無しさん
07/05/19 22:15:03
h=Hash.new(0);a.each{|e|h[e]+=1};p h

419:デフォルトの名無しさん
07/05/19 22:19:36
みんな騙されるな!
>>418は3行分だぞ!

420:デフォルトの名無しさん
07/05/19 22:32:34
てか>>416のinjectをバラしてeachにしたのが>>418のような気も…

ハッシュ作って登録しながらカウントというのはよくある手法だな
>>415みたいに素直に毎回サーチすると、対象の配列がデカいときに困ったことになる
…はずだ

421:デフォルトの名無しさん
07/05/19 22:44:05
>>415と同じようなfind_allの方法しか思いつかなかった俺は修行不足のようだ

422:413
07/05/19 22:53:19 BE:674495093-2BP(0)
ありがとうございます
cat foo.txt | sort |uniq -c みたいな感じです。

a.uniqがあるので何か一言で書く方法があるのかなと思いましたが
プログラム組まないと駄目ですよね。

423:デフォルトの名無しさん
07/05/21 10:06:59
scrapiを使おうとしました。
gem install scrapiでインストールして、

#!ruby -Ks
SRC_URL = "URLリンク(d.hatena.ne.jp)

require 'rubygems'
require 'scrapi'
require 'open-uri'
require 'pp'

links = Scraper.define do
 process "a[href]", "urls[]"=>"@href"
 result :urls
end.scrape(URI.parse(SRC_URL)).sort.uniq

pp links

以上のソースを実行したところ、

---------------------------
ruby.exe - 正しくないイメージ
---------------------------
アプリケーションまたは DLL (Rubyを入れたディレクトリ)ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so は
正しい Windows イメージではありません。これをインストール ディスクのファイルと照合してください。
---------------------------
OK
---------------------------

というダイアログが出てしまいます。
実行結果は、きちんとでているようです。

424:423
07/05/21 10:09:45
RUBYOPT = -rubygems
は、環境変数で指定してあります。

このダイアログがいちいち出てしまうのですが、出ないようにすることはできないでしょうか?

なお、cygwinのbash上から実行した場合は、何故かダイアログがでません・・・。


425:423
07/05/21 10:16:20
自己解決っぽいです。

検索してみると、どうも、libtidy.soがlinux用らしくて、

3 日坊主日記 - scrapi - ScrAPI toolkit for Ruby
URLリンク(moriq.tdiary.net)

によると、win32用のdllが先に読まれないようなので、

ruby\lib\ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so

libtidy.so.0あたりにリネームしてやると、
libtidy.dllが読まれて、ダイアログが出なくなりました。


426:デフォルトの名無しさん
07/05/21 16:07:18
腐ったgemだな。 > scrapi
本来入ってるはずでないlibtidyまで適当にぶちこんでるのか。




427:デフォルトの名無しさん
07/05/21 16:15:58
そうなのか?
Cygwinでエラーにならないのはなんで?

428:デフォルトの名無しさん
07/05/22 14:53:22
cygwin用のtidyが入ってんじゃない?

429:デフォルトの名無しさん
07/05/22 22:43:06
すみません。
正規表現Regexpでヒットした複数行をtxtファイルに書き込んで保存したいのですが、
良い方法ありませんか?

$stdout = File.open("xxxx.txt", "w")
というのでやってみたところ、
最初の一行と途中のやつが文字化けで現れるだけなんですが。。。

FAQにあったらごめんなさい。

430:デフォルトの名無しさん
07/05/22 22:57:22
>>429
a1. 正規表現で複数行マッチさせ変数に保存
a2. 複数行マッチした結果の変数の内容を画面に表示させ確認する

b1. 複数行の文章を手入力し変数に入れておく
b2. 複数行の文章を適当なファイルに保存、エディタなどで確認する

上記aとbを組み合わせ、
「正規表現で複数行マッチしたものを変数に入れその変数をファイルに書き出す」
ということをする
まずは一つ一つ成功させて積み重ねれ

431:デフォルトの名無しさん
07/05/22 23:03:21
ありがとうございます
入門書読みながら格闘してきます

432:デフォルトの名無しさん
07/05/23 21:50:58
あるmoduleのメソッドを別のモジュールでも使いたいと思い

module A
 def hoge puts "hoge"; end
end

module B
 include A
end

としたのですが、includeはクラスにのみ作用するようで、B.hogeとしても
NoMethodErrorとなってしまいました。

この辺りはRubyのメタプログラミングを理解する上でとても重要だと思うのですが、
どうもその辺りが理解がまったくできていないようです。

知る限りではmodule_evalなどがあるのですが、それも上手く行きませんでした。。
この場合はどのように処理すればよいのでしょうか?

 

433:デフォルトの名無しさん
07/05/23 22:02:56
includeはたぶん普通に行えています。
B.hogeのようなカタチで使用するには、Bの定義内で
module_function :hogeする必要があります。

434:デフォルトの名無しさん
07/05/23 23:23:10
そもそもそれじゃ A.hoge 自体できないだろうが。

435:デフォルトの名無しさん
07/05/24 01:51:17
>432
そもそも、そのコードじゃA.hogeも呼べなくね?
まぁB.hogeしたいなら、単にextendすればいいんじゃね。

436:デフォルトの名無しさん
07/05/24 02:32:34
>>432
メタプログラミングを理解する前にやっとくべきことがいろいろとありそうだな…。

437:デフォルトの名無しさん
07/05/24 08:09:29
module A
def hoge; puts "hoge"; end
end

module B
extend A
end

B.hoge

438:デフォルトの名無しさん
07/05/24 11:02:00
>>434-436
Aの方にclass << selfを入れ忘れ... orz
hogeメソッドはAのクラスメソッドのつもりでした。

>>437
ありがとうございます。できました!
Bの特異クラス?に対してincludeするって事なんでしょうか。
継承って言うより注入って感じだなぁ。。。

>>433
ありがとうございます。
includeだとインスタンスメソッドになってるから
module_functionでクラスメソッドに変えるって事なんでしょうか。
今回は>>437で行きたいと思います。


439:デフォルトの名無しさん
07/05/24 21:56:58
CGIでCookieを使おうと思ってマニュアルを頑張って読む。

URLリンク(www.ruby-lang.org)
> require "cgi"
> cgi = CGI.new
> for name, cookie in cgi.cookies
> cookie.expires = Time.now + 30
> end
> cgi.out("cookie" => cgi.cookies){"string"}

…。わかりにくいです先生。

440:デフォルトの名無しさん
07/05/24 23:29:17
require 'cgi'
cgi = CGI.new
now = Time.now

mycookie = cgi.cookies['accesslog'] # クライアントから受け取ったクッキー
unless mycookie.empty?
mycookie.value.push(now.to_s) # 既存のクッキーがあるなら時刻を追加
else
# クッキーが空の場合新規作成
mycookie = CGI::Cookie::new({ 'name' => 'accesslog',
'value' => [now.to_s], # 必ず文字列入り配列
'domain' => cgi.server_name,
'path' => cgi.script_name })
end
mycookie.expires = now + 60
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


わかりやすいサンプルって難しいな

441:デフォルトの名無しさん
07/05/25 03:08:39
Cookieの分かりにくさはRubyのせいじゃないからなぁ


442:デフォルトの名無しさん
07/05/25 03:38:13
1. ブラウザが'accesslog'という名?のクッキーを要求して来てます
2. 机にクッキー置いてあった => 時刻も付けとく
  机の上にクッキーなかったり => 新しく袋から出して、時刻も付けとく
3. 賞味期限を60日に設定 expire
4. とっとと、どうぞ召し上がっちゃってください

1. のとこの'accesslog' の辺りが よくわからないぽ …orz

'accesslog'いうのはキャッシュに保存されてるファイル名か
なにかなのかな?

443:デフォルトの名無しさん
07/05/25 11:26:02
Moduleのインスタンスは、作成した時点ではnameが""で
定数に代入するとその定数名がnameに設定されますが
これと同じことを自作クラスのインスタンスでも実現出来るでしょうか?

444:デフォルトの名無しさん
07/05/25 18:15:40
>>442
これはコメントがよくない


# クライアントから送りつけられた全クッキーの中からaccesslog名義のデータを取り出す
mycookie = cgi.cookies['accesslog']

   :
   :
   :

# 変更したクッキーをクライアントに返し、HTMLでaccesslogの値を<br>で区切って表示する
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


これならわかりやすい…かも
サーバー側は送ってもらうクッキーの名前を選べない
クライアントからはdomainとpathが一致するものを全て一気に送ってくる
(だから、変なのを濫造すると接続時に100項目くらいどばっと送られてくる羽目に)


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

5398日前に更新/121 KB
担当:undef