[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 23:56 / Filesize : 233 KB / Number-of Response : 880
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 33



1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。)
 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

684 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 04:05:24 ]
>>654
え、うそ!!!1
RubyGemsが遅いのってmswin32版のせいなの???
くっそー今まで散々苦労してきたのにー
確かにcoLinuxとかだとめっちゃ早いと思ってたわ。
mingw版だと早い?、とか

685 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 06:38:43 ]
とりあえずgemはバージョンが古かったら
サーバ側でバージョンが古いと怒って欲しい

686 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 07:35:58 ]
>>685
おう、そういう機能入れたから、rubygem をアップデートしてくれ

というわけで鶏と卵だ

687 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 07:43:14 ]
>>682
def initialize
@select_quests = Array.new
...
end

def set_select_quests
(0..9).each.do |i|
quest_number = rand(10)
# @select_quests に quests_number が含まれてなかった場合追加する
@select_quests << quest_number if @select_quests.include?(quest_number)
end
end

688 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 08:06:58 ]
>>687のifはunlessの間違いだと思う冬の朝

689 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:25:24 ]
rubyはwindowsで動かすとどうして遅いの?
ずーと前からみたいだけど直すきないの?

690 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:28:45 ]
開発者がアウトオブ眼中だから

691 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:29:00 ]
>>689
なんでWindozeを使ってるの?
LinuxやBSDやSolaris使えばいいだけじゃないの?
文句言ってるだけで何も行動しようとしないのはなんでなの?

692 名前:682 mailto:sage [2010/01/15(金) 20:46:00 ]
ありがとうございました
うまくいきました



693 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:46:26 ]
>>689
めんどくさいから
いやマジで
誰にでも絶対に起こるなら直されると思うんだが実際はそうではない

694 名前:デフォルトの名無しさん [2010/01/15(金) 20:50:00 ]
>>689
>>691みたいな人ばっかりだから

695 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:55:02 ]
>>693
だよね
むしろ嫌がらせっぽい

696 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:26:17 ]
WindowsOSがやめられないので、ちょっとずつPythonに移行し始めたよ。
既存のクラスにメソッド追加したり、injectとかがちょっと使いづらい以外不満はない。

697 名前:sage [2010/01/15(金) 21:29:39 ]
Pythonたんは、純粋なオブジェクト指向じゃないよね。
len() とか気持ち悪い。

698 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:37:14 ]
>>697
最初はそう思ってたけど慣れればそんなもんかって思えるよ。
あとは、三項演算子やcase文がないのがちょっと残念くらいなもんか。

699 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:38:39 ]
>純粋なオブジェクト指向
Rubyも「+」とか「end」はオブジェクトじゃないよね

700 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:41:20 ]
>699
不完全性定理というのがあってだな

701 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:19:11 ]
文字列をn文字ずつ&1文字ずつに分割したいのですが
x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
x = x.scan(/.{5}/)
x.collect!{|y|y.scan(/./)}
p x
=>[["A","B","C","D","E"],["F","G","H","I","J"],["K","L","M","N","O"],["P","Q","R","S","T"],["U","V","W","X","Y"]]
みたいに書くと都度、正規表現によるマッチが行われるので遅いです
もっと高速に実行する方法があったら教えてください。よろしくお願いします

702 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:20:42 ]
まあ俺は自分の仕事が片付けばいいだけだから
オブジェクト指向の純粋さなんてどうでもいいわ




703 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:31:44 ]
>>701
x.chars.each_slice(5).to_a とか。
Benchmark.bm で1万回ずつやった時間を比較したら半分弱の時間だった。


704 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:37:37 ]
>>701
x.split(/.{5}/)
x.split(//)

がたぶん一番速い
これでも遅いという場合はそもそもそんな莫大な配列を文字から作る理由は何というとこから

705 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:10:56 ]
>>704
そもそも要件を全然満たしてない件

706 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:17:57 ]
enumeratorと配列の違いって何ですか?
なんとなく大体同じもののように思えるんですが

707 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:42:36 ]
超巨大な集合から1つずつ取り出そうとしたとき、Enumeratorは全部を
覚えていなくてもいいぞ。
alphabets = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)

alphabets.combination(13).first(5) は造作もないが
alphabets.combination(13).to_a.first(5) はたぶんメモリ足りない。


708 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 00:46:48 ]
>>706
数えられて、返ってくる順番が保証されないのがEnumerator
Enumeratorを継承してるので数えられて、しかも順番情報を保持するようにしたのがArray

こう考えるとSetの出番がないんだがまあ誰も覚えてないし誰も使ってないと思うので気にするな

709 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 12:34:07 ]
>>701
シングルバイト文字限定でいいのかな?
であれば

x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
res = [[]]
x.each_byte do |b|
if res[-1] < 5
res[-1] << b.chr
else
res << []
end
end

で,どうでしょう?

710 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:39:59 ]
ruby1.9の正規表現で,\wがマルチバイト文字にヒットしてくれません。
以下のコードはなにか間違っていますでしょうか?

# coding: cp932
p "日本語" =~ /\w/s #=> nil

鬼車のドキュメントには\wは多バイト文字にマッチすると書かれているのですが。
ttp://www.geocities.jp/kosako3/oniguruma/HISTORY_5X.txt

711 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:44:55 ]
\w は Ruby では元々 [0-9A-Za-z_] という意味のメタ文字だったので、
1.9 でもそうなってる。

712 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:51:19 ]
>>711
Thanksです。
マルチバイト文字を含めた単語構成文字にマッチするナイスな正規表現ってありませんか?

あとドキュメントのURLが間違ってました。
ttp://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt



713 名前:710 mailto:sage [2010/01/16(土) 14:58:14 ]
自己レスです

# coding: cp932
"日本語" =~ /\p{Word}/s

でいけました。

714 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 15:02:56 ]
たしか ¥d が漢数字にマッチしてしまって使いにくくなってたので
その種のは使い分けるようになったんだっけ?


715 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:22:03 ]
>>709
1.9系なら↓でマルチバイトもOK

x = 'あいうえおかきくけこさしすせそ'
res = []
x.each_char.each_slice(5){|a| res << a}

716 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:29:26 ]
これでもできるな

x = 'あいうえおかきくけこさしすせそ'.each_char.each_slice(5).map{|a| a}

717 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:32:17 ]
Windowsのユニコードのファイル名が扱えるライブラリはありますか?

718 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:33:00 ]
>>717
ありません

719 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:38:28 ]
いやいやいやいや、直接API呼べば問題ないからさ
そういうライブラリがrubygemsあたりにでもないかという話だろう

でもこれで困るの日本人とかだからなー

720 名前:701 mailto:sage [2010/01/16(土) 18:50:38 ]
レスありがとうございます
>>703の方法が一番早いようなのでこれを使わせてもらいます

721 名前:デフォルトの名無しさん [2010/01/17(日) 10:37:45 ]
皆さんはRubyのコードを何で書いてるのでしょう?
やっぱり、Emacs or vim?

補完が効くのが良いのですが・・・・


722 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 10:48:27 ]
Emacsが無難ということに一応なってはいる

適当な統合環境が快適に動作する環境なのなら、エディタ部のコード書きの補完機能だけ使うのも悪くはない
Emacsを一度も使ったことがなくて基本キー操作から覚えなければならないというのだとすれば尚更

Emacsが好まれてるのはエディタの軽さの範疇を実際上は超えてないというのが大きい
もしEclipseやNetBeansが超サクサク動作だったならEmacsは時代遅れ度を2段階くらい上げていたはず



723 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:02:32 ]
Emacsは現代的なIDEが提供するところの補完機能を厳密にはもってない
…まあ、実用上はそれほど困らないが

724 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:35:27 ]
拙者は秀丸でござる。
感謝の意を込めてちゃんと送金したでござる。

725 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:35:48 ]
Emacs で指がつったら vim も試してみてね by vim厨

726 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:46:52 ]
>>721
主にNetBeans使ってる。IDE厨なのでw

ただし、NetBeansの最新の6.8はいろいろとバグが・・・

727 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:57:45 ]
俺もいわゆるスクリプト程度しか書かないからEmacsで十分だな
でもたしかにIDEがエディタ同様に軽ければそっち使うかも

728 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:36:38 ]
通常のエディタでは慣れてくると物足りない(プログラミング初心者は補完のないエディタでやること)
IDEはおおむね重いし遅いしプロジェクトとかそんなのが必要な大作ばかり作るわけじゃないから邪魔

というところにすこんと入るのがEmacs
全部できるが余分で煩雑で重い、というものを使うよりは、
やや足りなくて手作業が入るが軽快、のほうを選ぶ人は意外と多い

729 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:17:32 ]
emacs自体あんまり使わないんだけど、ショートカットキー一発で
全体を整形&フィリング(emacsではこういうのかな)できる設定ないかしら。

730 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:20:51 ]
あるお。
俺はCtrl-x hとかしたあと、Ctrl+Alt+\を押してる。
フィリング?は知らんけど。

731 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:20:54 ]
結局>>717は無いの?

732 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:21:05 ]
class C
 def hoge
  とても長いメソッド...
  local_var = value #<= ここだけを書き換えたい
  ...
 end
end

メソッド定義内のローカル変数たった一行を書き換えたいんです。
とても長いメソッドなので,class_eval{def...無意味なコピペ...end}をしたくありません。
スパッと書き換えることはできませんか?

とりあえずSCRIPT_LINES__とripperを使えば20行くらいでできるのですが,
もっとストレートな方法があるかもしれないと思い質問しました。
ちなみにbindingを使った実験には失敗しました。
よろしくお願いします。



733 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:05:33 ]
>>731
本スレ行って聞いてみたら

734 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:22:30 ]
Emacs が軽快とか隔世の感、とか言うのは多分年寄り。

735 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:32:07 ]
今は通信速度が速いから、Emacs も簡単にダウンロードできる。
昔はフロッピーで小分けにして、配布してたな。

736 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:36:14 ]
>>731
Perlの↓相当がgemにあればいいんだろうけど
perl-users.jp/articles/advent-calendar/2009/hacker/20.html
いまgemでサーチかけた感じだとなさそう

必要なら↑を参考にしてRubyにportしたら?

737 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:46:29 ]
>>731
1.9.2で扱えるようになるかも、ってことらしい
blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45826

738 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:54:30 ]
>>731 >>736-737
あれ、WindowsだとUNICODEファイル名ダメだったのかー
gemでモンキパッチみたいに簡単にWindowsのときだけOKにできるのとかあったら便利そうだね。
システムの根底だから難しいのかね

739 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:48:07 ]
>>736-738
ありがとう。だが初心者にはハードル高すぎ
1.9.2に期待しまつ。いつごろ出るんだろ?今年の春頃?


740 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:52:56 ]
一応「もう出てる」レベルではあるんだが、Windowsでは自力でソースからコンパイルしないといかん
rubygemsとかも未対応で動作しない可能性も大きい
しばらく前の1.9.1状態

来年くらいには使える状態になってるんじゃないかなあ

741 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 21:21:56 ]
なんか直接いじればどうにかなりそうな気はするんだけどねえ

742 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 21:54:31 ]
すいません、これ↓を使いたいんですが、何から始めればいいのか教えてください。
ttp://gist.github.com/211635



743 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:12:49 ]
>>730
フィリングってのはこういうの。文章の段落内でESC qでできる。
# ながーーーーーい説明文菜がーーー否がーーー否がーーーーーーーーーーーーーーーーーーーーい

# ながーーーーーい説明文菜がーーー
# 否がーーー否がーーーーーーーーー
# ーーーーーーーーーーーい

んで、ソースコード全体を一発で整形&フィリングしたいのんよ。ruby-modeで。

744 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:20:06 ]
>>742
見てわからんのならスクリプトがすこし違って詰まったときの対処も自力で全然できないということだから
素直に Ruby の勉強を進めたほうがいいような気がしないでもない

前情報として、Ruby の知識が全然ないのなら使えないよ
MySync GoogleContacts でぐぐると唯一出てくるから、
これをしたい場合は Ruby 上でこれを動かすしかないわけだけど、
まったくの一見さんが使えるようなクオリティにはそもそもなってない

を踏まえて
Ruby を適当にインストール、URL の Download からダウンロードして展開して、
au2gcontact.rb をてきとうなとこにコピー
その後、au2gcontact.rb 自身のファイルの文字コードを Shift_JIS というか CP932 に変換
MySync が吐き出したエクスポートの CSV(Shift_JISに変換済)を第 1引数に、
GoogleContacts に食わせたいファイル名を第 2引数にして、
ruby au2gcontact.rb mysync.csv output.csv
と実行
output.csv は ShiftJIS(というかCP932)だが、
これがそのまま GoogleContacts にでインポートできるかどうかまでは知らない

745 名前:742 mailto:sage [2010/01/17(日) 22:53:26 ]
なんかよくわからんまま試行錯誤したら一応の目的は達しました。ありがとうございました。以下俺メモです。

rubyをインストール。
ソース(っていうのかな?)をメモ帳にコピペ。拡張子を.rbに変える。
au2gcontact.rbとaddress.csv(←LismoPortが吐き出すやつ)とgcontact.csvをC:\Documents and Settingsに置く。
コマンドプロンプトからruby au2gcontact.rb address.csv gcontact.csv
出てきたのをgmailにインポートでおk。

いやーすごいですね。感動しました。ほんとありがとうございました。

746 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 01:19:39 ]
>>743
Emacs のスレで聞いたら adaptive-fill-mode の使い方なり filladapt.el の後継なり
何か情報が入るんでない?

747 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 03:41:47 ]
乗り遅れた感あるけど

vim+neocomplcacheでやっとります。

748 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:32:46 ]
> rubyはwindowsで動かすとどうして遅いの?
Ruby 1.8.7-p174 の select が遅かった話じゃなくて?
www.garbagecollect.jp/~usa/d/200909c.html
Ruby 1.8.7-p249 にすれば直るよ。

> たしか \d が漢数字にマッチしてしまって使いにくくなってたので
Ruby 1.9.1 の初期はそうだったんだけど、この挙動はバグ扱いされて修正されたので、
Ruby 1.9.1-p378 にすれば直るよ。

749 名前:742 mailto:sage [2010/01/18(月) 09:33:49 ]
追記。適当なソフトでau2gcontact.rbの文字コード変換をshift jisに変換。

750 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:18:11 ]
puts "日本語".inspect
とすると、"¥123¥456" みたいな表示なりますけど、これを "日本語" のままで表示させることはできませんか。

751 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:35:00 ]
1.8.7 mswin32の場合

irb(main):001:0> puts "日本語".inspect
"\223\372\226{\214\352"
=> nil
irb(main):002:0> $KCODE = "s"
=> "s"
irb(main):003:0> puts "日本語".inspect
"日本語"
=> nil


752 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:37:06 ]
-Kオプションの方がわかりやすいかもしれないと思い直した

>ruby -Ks -e'puts "日本語".inspect'
"日本語"



753 名前:739 mailto:sage [2010/01/18(月) 18:25:32 ]
1.9.2 preview1で試してみたけどダメだった

754 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 18:35:12 ]
だからそういうふうにそもそも作ってないんだから標準で用意されたメソッドをどう使おうと絶対に駄目だって

755 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 19:39:35 ]
火急的に困ってる人がいないんだろうね
見なかったことにするわけにもいかんと思うんだが、代替手段は何なのだろう
そこだけRubyを使わない?

756 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 19:58:33 ]
1.9.2で扱えるようになるかも、ってことらしかったんで

757 名前:デフォルトの名無しさん [2010/01/18(月) 20:21:42 ]
#!ruby -Ku
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8
fso = WIN32OLE.new('Scripting.FileSystemObject')
a = fso.CreateTextFile("♡♥♡♥.txt", true)
a.WriteLine("This is a test")
a.Close()

758 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 20:35:46 ]
笙。笙・笙。笙・.txt というファイルができました先生

759 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 20:39:55 ]
u

760 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:01:23 ]
環境とエディタによってはこのへんきちんと動作するように保存するのは微妙に難しいぞ
慣れればどうということもないんだが

761 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:11:27 ]
おお! できました!! ありがとうございます!!!
これどうすればIOやDirで扱えるんですか?

762 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:20:06 ]
>>761
扱えない
全部 WIN32OLE 内で完結させる必要がある
必要なのは Ruby の知識じゃないね



763 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:33:40 ]
ですよねー...

764 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:35:43 ]
最初と最後にリネーム処理かませば Ruby から扱うのも不可能ではないと思う

765 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 22:55:11 ]
先生質問だよ質問

data = {/key/ => lambda{|m| "<#{m}>"}}


data.each_pair do |re, p|
 file.gsub!(re){|m| p.call(m)}
end

p file #=> key が <key> になってる

というような、
{正規表現 => キーのマッチ結果を便利に利用した結果の返り値またはただの文字列}
というデータを用いた連続置換をしたいのです
それで、data は外部から自由に与えたいのです

でも、よく考えたら lambda を作った時点では gsub の $1 も \1 もまだ無いから利用できないわけで
なにかうまい方法ないですか
eval ならなんとかなると思ったんだけど普通の置換後に使いたいだけの文字列も eval してしまいます

766 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:47:16 ]
>>765
m = Regexp.last_match
puts m[0]
とかでできないかな?

あと
data.each_pair do |re, p|
 file.gsub!(re, &p)
end
でいいような気がするけど試してはいない。


767 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:55:48 ]
こういうことだろうか。

to = data.each_pair.inject(from) {|result, pair| result.gsub(pair[0], &pair[1]) }


768 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:59:30 ]
これではどう?

a = 'abc def'
data = [['(\w+)', '<\1>'], ['(> <)', '> < \1 > <']]
data.each{|reg, rep| a.gsub!(/#{reg}/, rep)}
a => "<abc> < > < > <def>"



769 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:09:09 ]
>>768
なにそのわかりやすくしようとする気概をぜんぜん感じない例

770 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:10:57 ]
>>765

766-768が書いているようにgsub!の第2引数で置換パターンを書いたほうが
単なるstringでパターンを渡せるので簡単だと思う

766,767が書いてるパターンの前の '&' って
どういう意味?

771 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:21:13 ]
>>770
ttp://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html

772 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:26:03 ]
なるほどProcを渡してるのねthx
俺には768の方がわかりやすいな、例は見づらいが



773 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:42:38 ]
だって先生が gsub はブロック使えって言ったんだもん言ったんだもん言ったんだもん

>>766-768
irb> data = {/k1/ => 'v1', /k(2)/ => 'v\1', /k3/ => lambda{|m| m.sub(/k/,'v')}}
irb> str = 'k1, k2, k3'
irb> data.each_pair do |re, p| p.kind_of?(Proc) ? str.gsub!(re, &p) : str.gsub!(re, p) end
irb> p str
"v1, v2, v3"

思ったことに近いことができましたーうおー
助かりましたせんきゅうです

774 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 03:46:28 ]
1byte文字以外をマッチする方法を教えてください
s="123123456456"
s.gsub!(/〜/){|c|
uni_enc(c)
}
p s
=>
123%uFF11%uFF12%uFF13456%uFF14%uFF15%uFF16
みたいに1byteじゃない文字だけ変換して置換したいです
よろしくお願いします

775 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 06:56:24 ]
$KCODE='s'
s="123123456456"
s.gsub!(/./){ |ch|
(ch.length==2) ? "(#{ch})" : ch
}
puts s;

776 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 07:36:20 ]
1バイトじゃない文字だって言ってるのにわざわざ2バイトをチェックするとはこれいかに

777 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 14:27:57 ]
# coding: sjis
# Ruby1.9以降か正規表現エンジンに鬼車を使用

s="123123456456"
s.gsub!(/[^\p{ASCII}]/){|c|
"%u"+c.encode('utf-8').ord.to_s(16)
}
p s

778 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:08:32 ]
test = {"うし"=>5, "うま"=>3, "うし"=>1, "うし"=>2, "うま"=>4}
test.each{|key, val|
}

これを実行したら最後二つの"うし"=>2と"うま"=>4しか処理が実行されないんですが
キーの要素が一緒だと前にある奴は消されてしまうんですか?
またこれをハッシュの数分だけ実行させることはできないんでしょうか?

779 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:22:15 ]
>778
ハッシュの意味を勉強してこい

780 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:30:11 ]
配列の配列を使う方法
test = [ ["うし", 5], ["うま", 3], ["うし", 1], ["うし", 2], ["うま", 4] ]
test.each {|k, v| use(k, v) }

値が配列になったハッシュを使う方法
test = {"うし"=>[5, 1, 2], "うま"=>[3, 4] }
test.each {|k, a| a.each {|v| use(k, v) } }


781 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:44:49 ]
文字列
a0-0 a0-1 a0-2 a0-3
a1-0 a1-1 a1-2 a1-3
a2-0 a2-1 a2-2 a2-3

から任意が選ばれた配列a
a=["a0-0","a2-2","a2-3"]
より、
配列bを作成したいのですが、
なにか良い方法はないのでしょうか?

b=[[1,0,0,0],[0,0,0,0],[0,0,1,1]]


782 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:51:33 ]
只今から上位エスパー召喚の儀を執り行う



783 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:54:09 ]
"a0-0" → [1, 0, 0, 0]
"a2-2" → [0, 0, 0, 0]
"a2-3" → [0, 0, 1, 1]

という対応があるように見えるのだが、2つめは [0, 0, 1, 0] ではない?
どういうルール?



784 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:55:50 ]
>>782
失敗してるぞw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<233KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef