※テンプレはくだらないから貼らないように
,―ヽ_(((((_、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ IPA Rubyスレにようこそ i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i |
もう、さすがに、1.9.2を初心者に勧めてもいいよね?
6 :
デフォルトの名無しさん :2011/07/27(水) 09:18:45.81
Windows以外で、UTF-8中心の生活をしているならあまり困らないと思う。
7 :
1/2 :2011/07/27(水) 14:11:20.15
initalizeからメソッドを呼びたいのですが、どうやったらいいですか? Class A Class A_A < A Class A_B < A という派生クラスの関係があって、 Aの派生クラスのA_AとA_Bで、初期値が共通のインスタンス変数があるのですが、 それを初期化する場合、A_AとA_Bで一々インスタンス変数への代入を 宣言しないといけない訳ですが、この代入処理をAのメソッドにして A_A、A_Bどちらからでも呼べるようにしたいのですが。
8 :
1.5/2 :2011/07/27(水) 14:12:02.48
通常はクラス変数で共有すれば良いのですが、 そうすると、外部クラスからアクセスできなくなるので問題になります。 Class Aにアクセッサメソッドを追加したり、あとでもう一度メソッドを呼び出して 処理する手もあるんですが、煩雑な気がするので良い方法はありますか?
9 :
2/2 :2011/07/27(水) 14:12:21.48
コードとしてはこんな感じです Class A @@a="0" @b=@@a Class A_A < A def initialize() @b=@@a attr_accessor :b Class A_B < A def initialize() @b=@@a attr_accessor :b @b=@@aが常に出てくるのがうっとおしいなと。 他にはクラスを初期化したり、さらに複雑な変化もやってるので、すっきりさせたいのですが。
>>7-9 superじゃだめなん?
class A
@@a = "O"
attr_accessor :b
def initialize ; @b = @@a ; end
end
class A_A < A
def initialize ; super ; end
end
とここまで書いて思ったんだけど
class A
@b = @@a
end
はクラスインスタンス変数の定義であってインスタンス変数ではないよ、って事かな?
char はシャーだろ
キャーだろ
チャル
シャアだな
キャラ以外なら何でも
16 :
sage :2011/07/28(木) 07:30:04.47
すみません助けて下さい。 windows7 64ビットでqtruby4を使おうとしています。 公式のQtインストーラと、qtruby4-2.1.0-x86-mswin32.gemをgemでインストールしました。 インストール自体は終わったのですが、irbで irb(main):001:0> require 'Qt4' を書くと、
LoadError: no such file to load -- qtruby4 from C:/Ruby191/lib/ruby/gems/1.9.1/gems/qtruby4-2.1.0-x86-mswin32/lib/Q t4.rb:5:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/qtruby4-2.1.0-x86-mswin32/lib/Q t4.rb:5:in `rescue in <top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/qtruby4-2.1.0-x86-mswin32/lib/Q t4.rb:1:in `<top (required)>'
from (irb):1:in `require' from (irb):1 from C:/Ruby191/bin/irb:12:in `<main>' と出て動きません… Qt4のロードに失敗しているのでは無く、qtruby4のロードに失敗しているのが原因不明です… 一応Qt4.rbのあるディレクトリには、qtruby4.dllが存在するのですが…
qtruby4って動作しないgemなんじゃなかったっけ 他の使え
昔は動いたんだけどね…
qtruby4がマトモに動作してた時代なんてねーよw
def func .... end def func() ..... end この2つの違いってなに?
同じ 省略可能なだけ
Marshal.dump した文字列に magic 文字列付くようにならないかな? file(1) で「data」としか出なくてさびしい。
そういうのは自前でつけて自前で外してくれ dumpの返り値はeval可能文字列という以上の役目はないので
>>25 「eval 可能文字列」ってどういう意味ですか?
今んとこ先頭 2 バイトが 0x04 0x08 だったら、で判定できるが、 各OSの /etc/magic に登録してまわるにはしのびないな。
>>27 ですよね。バージョン番号だから、今後変わる可能性がありますし。
たとえば、 R U B Y 0x05 0x00 みたいに 4 バイト増えたとして、 困る人いないと思うのですが、いかがなもんでしょうか?
>>26 irb> 'にゃんこ' == eval('にゃんこ'.dump)
=> true
このへんの話かと思う
31 :
886 :2011/07/28(木) 20:17:26.01
Rubyで、ファイルに書き込むような処理をwhile文で繰り返し走らせて、一定時間がたつと別のファイルをオープンしてそこに書き込み、また一定時間がたつと別のファイルへ という処理をしたいのですがどうすればいいでしょうか?お願いします
(可能なら)evalで元のオブジェクトが得られる文字列表現を返すのは…… to_s にも inspect にもそういうことは書いてないな。確かそういう解説を どこかで見かけたような気もするんだが。
誰に教えられたか知らないけど、とりあえず while は忘れろ Ruby で while なんて使う人はいない(while gets を除く) 常に起動したままにしてタイマー処理するというのも Ruby はあまり得意ではない 素直にタスクスケジューラとか cron とかの外部のスケジューラに登録しとけ で、超一般論としては ”日付_24時間制.txt” とかいうファイル名にしておいてそれに追加書きする 本日夜 9時までなら 2011-07-28_20.txt だし、9時からは 2011-07-28_21.txt に書き込まれる 時刻を文字列にするには Date#strftime とか使う、まあ Date のメソッドならなんでもいい これの欠点は1日経過でファイルが24個になることで、まとめたり固めたりするのは別のスクリプトの仕事だったりする 何をやるかがわからないので、それ以上はなんとも
35 :
7 :2011/07/28(木) 21:52:39.81
>>10 ありがとうございます。
superなんて便利な命令があるんですね・・・ってOOPの基本ですねw
36 :
デフォルトの名無しさん :2011/07/28(木) 21:56:10.85
>>31 File::open("hoge.txt","w"){|f|
f.puts "hoge"
}
sleep 100035
File::open("hogehoge.txt","w"){|f|
f.puts "hoge"
}
37 :
デフォルトの名無しさん :2011/07/28(木) 22:34:10.86
こんなんでどうでしょ?
>>33 色々とありがとうございます!
やってみます
39 :
デフォルトの名無しさん :2011/07/29(金) 00:46:06.28
こんなの作ってみた。 応用すれば指定時まで休むタイマーくらい簡単に作れるよ。 精度を求めるなら、whileループにして適当に補正掛ければいいし。 class Timer def self.waitToSec(sec) # 指定秒が来るまで休む remain = sec - Time.now.sec.to_i remain += 60 if remain < 0 sleep remain end def self.waitToMin(min) # 指定分が来るまで休む remain = min - Time.now.min.to_i remain += 60 if remain < 0 sleep remain *60 end end
40 :
デフォルトの名無しさん :2011/07/29(金) 12:53:41.77
Active Recordのデータを使って基本(要約)統計量を求めるメソッドかライブラリはありますか? 平均値はあるようですが,他の最頻値とか中央値等々を求めたいのですが,見つけられませんでした。(自作しか無い?)
普段と言われると自分用スクリプトがメインだから 自分の好きな感覚で書いてるだけだな
>>42 んー・・・用途を考えるとそんなもんか
ありがとう
リンク先のサーバーが落ちているかどうか判断させるにはどうしたら良い?
45 :
デフォルトの名無しさん :2011/07/29(金) 21:09:52.09
名前が引けないのか、 経路がないのか、 80番が応答しないことなのか、 どこからどこまでが「落ちている」なのかな。
hoge = "a = #{a} b = #{b}" という書き方じゃなくて、 hoge = "a = %1 b = %2".arg(a).arg(b) みたいな書き方をしたいです。文字列と変数を分離することができるからです。 こうしたいとき、rubyではどう書けば良いでしょうか?
hoge = "a = %s b = %s" % [a, b] みたいな感じで、詳しくはsprintf参照
rubyってメルツバウみたいなのつくれんの?
可能だと言わないと怒る馬鹿がまだ常駐しているかもしれないので、可能だと答えておく 普通はそんな爪楊枝で鉄球をつまむような芸はやらない
まあバイナリ入力が可能でバイナリ操作ができてバイナリ出力ができる言語だからな 実際になにをどう作るかは知らんが、実現可能性だけで言えばどんなことでもYESだ 宇宙すら作れると言ってもいい 俺が宇宙作るならCで作るけどな
>>48 ぐぐってもよくわからんノイズ音楽のことか?
詳しくないがジェネレイティブな音の生成ならルビーに限らず言語があったはず
ルビーで使えるライブラリはどこかあったかな
メルツバウは他にも建築や映画もあるようだが
>>40 まずActiveRecordと統計処理は切り離して考えるといいんじゃないかな
"統計処理"や"ruby 統計処理"でググるとR言語のruby実装が見つかったが使ったことないから今のrubyで使えるかは知らない
最頻値や中央値だけなら実装したほうが早いとは思う
54 :
46 :2011/07/30(土) 19:50:48.31
55 :
デフォルトの名無しさん :2011/07/30(土) 20:08:31.54
試しに実装してみたけど、モードはともかくメジアンをSQLでやるのは結構めんどかった。
>>56 SymbolはStringのように見える整数。
"foobar" == "foobar" は、文字列が長くなるほど時間がかかるけど、
:foobar == :foobar は、実際には整数同士の比較なので一瞬で終わる。
ハッシュのキーには、文字列を使うよりSymbolを使った方が速いのはそのせい。
58 :
デフォルトの名無しさん :2011/07/31(日) 16:25:03.85
>>53 ありがとうございました。
繰り返しで処理するのも若干,芸が無いかなと思い,質問しました。
地味にがんばります。
Symbol は GC で回収されないので、 Hash のキーに Symbol を使うのってどうなんだろ、って思う。 例えば、キーをどんどん変えていってメモリを枯渇させる攻撃とかできそうで。 まあもっと効率的な攻撃はいくらでもあるだろうから気にならないかもしれないけど。
ディレクトリが空かどうか判定できるメソッドはありませんか?
61 :
デフォルトの名無しさん :2011/08/02(火) 20:20:05.69
ないみたいだな。 判定内容的には、 Dir.entries(dir).sort == %w(. ..) Dir.entries(dir).join == '...' Dir.entries(dir).size == 2 あたりになるのかな。
ルートの場合の..ってあったっけ?(Windowsならドライブルートか)
って書いてから思った UNIX系なら正常動作してる状況でルートが空なワケないわなw Windowsのドライブルート(Cは空じゃないだろうから、Dとか)ってどうなるんだろか
64 :
デフォルトの名無しさん :2011/08/02(火) 20:51:01.24
OSX Lion(Darwin)のdient(5)には the system root directory `/', has no parent and dot-dot points to itself like dot. とあったが、Dir.entries('/') は .. も含んでるな。
65 :
デフォルトの名無しさん :2011/08/02(火) 20:51:47.74
あ、誤読しちゃった。 .. は . と同じように自身を指してるってことか。
>>59 ユーザ入力値からSymbolを作らなければいい。
59は、ハッシュのキーにSymbolを使うことと、ユーザ入力値からSymbolを作ることを混同している残念な子。
67 :
59 :2011/08/03(水) 12:16:56.93
>>66 そうかあ。
query_string.split(/&/).inject({}){|h,e|k,v=e.split(/=/);h[k.intern]=v;h}
とか思わずやってたりしない?しないか。これは失礼。
68 :
59 :2011/08/03(水) 13:20:46.92
ActiveSupport::HashWithIndifferentAccess なんかはどうやってるんだろう、 と思ってみてみたら、中ではキーを String にして扱ってるんだね。 これじゃあ Symbol で高速にするというメリットは全然無くて 何やってんだこれって感じだなあ。 「速い」以外で Hash のキーを Symbol にするメリットって何かあるのかな?
ハッシュのキーって文字列とシンボルでほんとに速度に差があるんだっけ?
うーんと、キーの Object#hash の計算にどれだけ時間がかかるかがポイント String#hash は現在の内部文字列を見ていちいち計算してるから遅い Symbol#hash は生成されたときに決まった一定の値を常に返すから速い でどう
>>67-68 >>67 みたいなことはやんないなあ。intern自体の使用頻度が稀だと思う。
Symbolは基本的にはコードに直書きするときか、直書きされたシンボルを扱う前提の処理にしか使わないや。
「内部的に数値な文字列」という解釈も「文字列ではない」というのを強調する意味で確かにアリなんだけど
その本質は「処理上の名前、ラベル」だと思う。
いずれにせよ、文字列とは根本的に違うもの、というのが強調できるのがポイント。
例えば:
・x.hoge = fuga というのを成り立たせるようなオブジェクトxをclass文とかattr_系使ってわざわざ作成するのがだるい場合に属性名をキーに置き換えたハッシュで使う
→ x[:hoge] = fuga
・メソッド名やモジュール名などを引数とするメソッドで、名前の指定に
→ attr_accessor :hoge
・メソッドの引数を「パラメータ名=値」の形式で欲しいとき(パラメータとなり得る要素が多い場合や省略可能な引数が多い場合など)にパラメータ名をキーとしたハッシュとして指定してもらう
→ create_foo(:title=>'bar', :height=>480, :width=>640)
・引数として数種類の「名のある、順序のない値」を要求したい場合にシンボルで渡してもらう
→ change_mode(:FOOBAR_MODE)
ブロックとProcとlamdaの違いを教えて下さい。nextとbreakとか
>>71 >その本質は「処理上の名前、ラベル」だと思う。
ふつうは、Symbolが「名前」や「ラベル」なら、やっぱり文字列と同じじゃん、と思うよ。
こんな説明で「文字列とは根本的に違うもの」と言われても、納得できない。
C言語でいうdefine定義した定数とか、enumとかでしょ 文字列とは大違い
>>73 理解力のない馬鹿はほっときゃいいんだよ
遅かれ早かれどうせ脱落するんだから
Ruby に alarm(3) を呼ぶ機能って無いですか?
下記のソースでclass Aの名前が変更されたときにA.bが動くようにしようと思い、 A.b('hoge')をself.b('hoge')に変更しましたが、ArgumentErrorが発生してしまい、 希望と違う結果になりました。 どのようにするのが正解なのでしょうか? class A class << self def b(param) puts "#{param}" end end def b A.b('hoge') end end A.new.b
>>78 self.class.b('hoge')
> class A の名前が変更されたとき ぬーん…? まあ、ともあれ、 class A def self.cls; puts "#{self}です"end def main A.cls end end としたとき、 A.new.main は「Aです」と表示するが、 class B < A; end B.new.main であっても「Aです」と表示する いわゆるクラスメソッドはクラスオブジェクトに属するインスタンスメソッドなので、 継承後のクラスオブジェクトのインスタンスメソッドclsを呼ぶようにすればいい class A def self.cls; puts "#{self}です"end def main self.class.cls end end
82 :
77 :2011/08/05(金) 16:10:34.76
ソースを grep alarm したけど無いっすね。 スレッドの実装で使ってる setitimer(2) と競合するからですかね。 RubyInline で alarm(3) しようかとも思いましたが、 何が起こるかわからなくて怖いので、まあ諦めます。
>>82 Process.killでSIGALRMを送るってのはどうですか?
class myClass def myMethod() myOtherObject end end myMethod()の意味がわからないんだけど return myOtherObject.new() と同じ意味?
>>84 return myOtherObject
return の省略はできない ただし、それとは別に、メソッドの戻り値は自動的に最後の処理の値になる 処理が1個しかないから、my_method の戻り値は my_other_object になる あと、Rubyではローワーキャメルケースは全く使わない (使ってるのは、他の言語から来てこの傾向をまだ知らされてない人) アンダースコアで区切ってくれ
うん、returnを書く必要が通常そもそもないんであって、return を省略できるというのとはちょっと違うな
sqlite3の使い方を勉強したいのですが、 あまり大きくないアプリでオープンソースなものありませんか?
いみふ
92 :
90 :2011/08/05(金) 22:44:12.09
>>91 読み返すと確かに。
sqlite3を使ってるサンプルソースを見たいのです。
軽量Rubyのα版ってのが7月末ごろにリリースされたんじゃなかったっけ? どこで手に入れることができるの?
>>93 来年春頃。
RubyKaigi 2011でRiteについてmatzが話している。
ファイルの情報を取得するctimeとmtimeって何が違うんですか?
96 :
デフォルトの名無しさん :2011/08/06(土) 08:19:35.76
内容がmtimeで属性がctime。
ていうか、これはたいてい説明がついてると思うのだが 説明すらないんか
98 :
デフォルトの名無しさん :2011/08/06(土) 09:44:34.74
mtime のほうは不親切かも? 新リファレンス ctime(filename) -> Time 状態が最後に変更された時刻を返します。 状態の変更とは chmod などによるものです。 mtime(filename) -> Time 最終更新時刻を返します。 とはいえmtimeだけだと分からんかもな。 旧リファレンス ctime は状態が最後に変更された時刻、 mtime は最終更新時刻を Time オブジェクトとして返します。 なお、ctime における状態の変更とは chmod などによるものです。
そもそもの mtime と ctime そのものだからな… ファイルを作成すると、mtime と ctime が更新される ファイル内容を編集しても、mtime と ctime が更新される ファイルの読み書き実行や所有者、リンク数などの属性を変更したら、ctime だけ変更される ファイルを普通に通常コピーすると、mtimeは保持され、ctime はコピー時刻になる
UNIX の man をそつなく調べれるレベルじゃないとこのへん辛いよね。
101 :
デフォルトの名無しさん :2011/08/06(土) 19:07:21.31
「select(2) と同じ」とかな・・・
102 :
95 :2011/08/06(土) 19:28:11.97
回答ありがとうございます。 Unixに疎いのでmtime、ctimeという存在自体知りませんでした。 勉強になりました。
103 :
デフォルトの名無しさん :2011/08/06(土) 20:58:09.06
ctimeを作成(creation)時刻と説明している書籍・記事は窓から投げ捨てよう。
105 :
デフォルトの名無しさん :2011/08/06(土) 23:08:37.64
change だね。
ってことはmはmake?
modifyじゃね
…じゃあ、作成日は何timeなのでしょうか
109 :
デフォルトの名無しさん :2011/08/07(日) 01:09:48.03
UNIXのファイルシステムには作成時刻は記録されていません。
Windowsだと 作成日時と更新日時 なんじゃね?
紛らわしいからmacで統一しろ
WIndows では Modify と Access と Created と Entry Modifiied の4つ Entry Modified は内部値で、エクスプローラでは表示されない 編集アプリケーションによっては時々空っぽになってる不思議値ちゃんだが 慣習として、 NTFS に対する ctime 相当は Etime を読んでるは…ず
作成日ないのか、ちょっと意外 ちょっと自分でも調べてみたけど、使い分けがよく解らん… …が、これ以上はUnix板かどっかで聞こうと思います、ありがとうございました
ファイルの本文内容が編集され変更された場合はmtimeが更新される ファイルがコピーされたり移動されたりして来た場合は、ctime にコピーや移動の時刻が記録される(mtimeは不変) ユーザーがファイルの所有権をコマンドで変更した場合も、ctime にコマンドの実行時刻が記録される(mtimeは不変) いちいち ctime 変更すんなカス、という需要(など)向けに cpio と呼ばれるコマンドがあり、これはコピーしても ctime を変更しない いわゆるファイル変更の検知は mtime でいいはず そのファイルがいつからそこにあるのかの値が ctime これだと一般向けではたいへん不便なので、マッコスXではファイル作成時刻も独自に記録している
作成日がわからないってUNIXって欠陥OSなんですね
>>115 そうですね。
世の中に欠陥のないOSはありませんしね。
作成日がわかったらなにかいいことあるのか? 実用上は更新日だけで充分だよ
一番しょうもない意見言っちゃったな
自分なりにいろいろ調べたつもりなのですが、 cgi/session の session_path の指定方法がわからなくて困っています。 どう設定したらよいのでしょうか? 教えてください、お願いします。
公式で紹介があるだけで、別に公式じゃないからなあ 超緊急なセキュリティフィックスがあるわけでもないし、こんなもんじゃね
122 :
120 :2011/08/07(日) 21:04:11.25
>>121 そういうものか、ありがとう
英語版ではruby installer一択になってるし、ruby installerにしときます
しかし公式ページは英語版の方が充実してるんだなぁ
devkitも入れとこうぜ!
バグ報告をしたいのですが、どなたか教えていただけないでしょうか? Ruby バグレポートガイドラインには、 「3. 以下のページを開き、New Issues をクリックする。 」 と書いてありますが、ページの先に「New Issues」がなくて…
>>124 Redmimeに登録してログインすると「新しいチケット」というメニューが表示される。
126 :
124 :2011/08/09(火) 00:53:11.17
>>125 早速登録してみることにします。
登録しないと駄目なのかな?とは思いつつも、登録ページに説明が全くないので、
いきなり登録とかしていいのかな?と及び腰になっていました。
ありがとうございました。
解説書くような人は普段から常にログイン状態になっててそれが普通のことだと思ってるからな まあ、テスト重要ってことだ
あー、redmine に登録しないでも ML 連携機能で一応作れたりはするんだが、 いろいろややこしくて、事実上非推奨だからな。 あと、まずは ruby-dev に投げる、というのもとりあえず悪くはない。
redmineってrails3では使えないから使わない。
>>129 別にそういう話をしてるわけじゃないっつーの。
Net::HTTP.version_1_2 これって何してるんでしょうか? 「おまじない」って説明ばかりで...
とても古いメソッドを破棄して、新メソッドを使用するように設定する記述 Ruby 1.8 からはこれ相当がデフォルトで有効になってるので。記述する必要はまったくない
133 :
131 :2011/08/09(火) 12:01:36.80
Net::HTTP の バージョン 1.1 ってのは、太古の昔の ruby 1.6 と呼ばれるものに付属してたやつ Net::HTTP の バージョン 1.2 は、ruby 1.8 と 1.9 以降の現行に付属してるやつ ruby 1.6 上で Net::HTTP.version_1_2 と書くと、Net::HTTP の バージョン 1.2 の内部メソッドが使用されるように切り替わる ruby 1.8 上で Net::HTTP.version_1_1 と書くと、Net::HTTP の バージョン 1.1 の内部メソッドが使用されるように切り替わる 現行の ruby 1.8 と ruby 1.9 において、Net::HTTP.version_1_2 を起動させる必要はまったくない まあ、誰も解説しないのも良くないんだけど、誰もソース読まないのも正直どうかと思う
require 'rubygems'も1.9では要らないんだっけ?
>>135 いらない
require 'rubygems' と書いてあったときは、ほぼコストゼロで、単に無視される
Ruby 1.8.x でも書かずに済むようにしようという草の根運動があったんだけど、まあ見事に頓挫した
Ruby 1.8.x でも動作するスクリプトの場合は書かないとものすごく不親切
Ruby 1.9.x でしか動作しないスクリプトであるなら、書く必要はないというか「もしかして1.8でも動く?」とか期待させるのでよくない
shebangに#!/usr/local/bin/ruby1.9とか書いちゃう俺 「ああ、これ1.9前提のコードなんだな…」って思ってくれる…よね?
マジックコメントでいいじゃん
Emacs使ってない人はこれだから
Emacs使いは初心者ではない
>>139 そんなこと言うと
# -*- encoding: utf-8 -*-
という書き方を標準にするぞ
>>140 Emacs の使用と Ruby 初心者かどうかには相関はない
> Emacs の使用と Ruby 初心者かどうかには相関はない 根拠は?
そりゃ Ruby は単体でプログラム言語だからだろ Emacs に習熟しないと Ruby が使えず、Ruby が使えないと Emacs を活用できないというのならその論理は成り立つが
おまえ確率・統計と集合理論の区別がついてないだろ
何もそんな難しいこと言わなくても Emacs使ってます。今日からRuby始めます そんな人がお前はRuby初心者じゃないなんて言われたら驚くだろう
Emacs使ってます。今日からLisp始めます。 でも成り立つかも。
>>145 おまえ確率・統計と集合理論の区別がついてないだろ
Emacs使ってます。今日からプログラミング始めます。 でも成り立つだろ。 日本じゃ馴染み薄いけど、あっちじゃ執筆ツールとしてEmacs使われてるんだから。
system(cmd)のcmd部分をエスケープ処理したいのですが、 何かライブラリ等ご存知ないでしょうか。
>>148 標準添付の shellwords とか。
下手にやると簡単にセキュリティホール作り込むことになりかねないので注意してな。
複数引数のsystemならシェルは経由されない
シェル経由されないってなんだろうね
153 :
デフォルトの名無しさん :2011/08/10(水) 21:24:42.86
リダイレクト記号やらグロブやらがシェルで解釈されてしまうことがない、かな。
ruby 1.87 を使っています。 rubyのプログラムからmysqlにデータを書き込んでいたら、 突然フリーズし、再起動後 ファイルを実行しても ruby: No such file or directory -- hallo.rb;(LoadError) と表示されて動かなくなりました。 ruby -v と打つと、 ruby 1.87と表示はされます。 この状態を治すにはどこをいじればよいでしょうか?
155 :
154 :2011/08/11(木) 16:04:43.82
自己解決しました。 ruby file.rb; とやっていました。;これがいりませんでした。
require 'rubygems' require 'mysql' doc = Mysql::new('localhost', 'root', 'pass','test') doc.query("insert into table_d values ('2006-12-13')") 上のようなファイルでmysqlに書き込んでいるのですが、下記のように日付を変数として扱いたいのですが、 下のようにするとエラーがでます。どうやって変数にできますでしょうか? require 'rubygems' require 'mysql' y = '2006-12-13' doc = Mysql::new('localhost', 'root', 'pass','test') doc.query("insert into table_d values (y)") よろしくおねがいします。
Rubyに関する基本的な解説を何かでまとめて学ぶことをお勧めする それに回答したとしても、間違いなく、5分後にまた別の質問が来るだろう
いくらRubyを学んだところで、拡張ライブラリの使い方はわからんだろう
他の言語でも同じだと思うが 文字列の中に変数名を書いてもただの文字列だ 文字列中に展開したいなら#{}でくくればよい というかまずはググレ 文字列 変数 Ruby とでもググればでてくるだろ
ただ問題は文字列がクエリ文字列だということだ
ここまでなにがなんでもプレースホルダを教えてやらないおまえら最高。
>>161 んなこと言ったら query メソッドなんて使うなという話になるぞ
ならんがな
#{}とか言っちゃう人はもっと勉強しましょう
すまんかった SQLなんて使ったことないもんで
ここって初心者以外の人いるの? 初心者同士で回答しあってるだけ?
Rubyそのものについては明らかに初心者ではない詳しい人がいるよ
ひとくちにRuby使いと言っても、根本の部分以外の 各種ライブラリとかに関しての知識/経験は人それぞれだからな 俺はあまり経験が無い分野に関してはレスせずに見守ってる
別に埋め込みでも動作するぞ まあ、全部自前でエスケープしないといけないが
で、生成される文字列がエスケープする必要ないのでそのまま書くことについて是非をうだうだと
>>167 この板のRuby初心者を集めて隔離するスレ
なので、すくなくとも書き込む人の中に初心者はいる
「回答」する人はあんまり初心者でもない
まあ、分野によっては初心者以下だったりもするが
見たとこ、科学や計算分野は弱い模様
172 :
156 :2011/08/11(木) 22:14:10.22
みなさまいろいろなお返事ありがとうございます。 プレースホルダというヒントをくださり、感謝です。 ぐぐって自分なりに調べていますが、まだ、解決できません。 もう少しがんばります。
ActiveRecordとかSequelとか使えばいいんじゃないかと。
174 :
156 :2011/08/12(金) 02:22:50.61
>>173 ありがとうございます。さっそくSequelインストールしましたが、使いかってのよさを感じております。
MYSQLのtableの文字列(varchar)には、#{ }で変数を代入できるのですが、日付(date)や数字(int)
の場合の変数がわかりません。
>>160 今さらだが、PerlやPHPだとそのまま変数名を書いても展開される。
$var = "Variable";
print "\$var: $var";
で $var: Variable と出力される。
そのまま書くというか、変数表記自体がプレフィックスつきだからなあ この理屈だとRubyもインスタンス変数あたりは埋め込みなしで書けてもいいことになるが
変数に普段付けるプレフィックスと、文字列リテラル中のエスケープの プレフィックスを一致させてるという謎設計、って解釈すればいいんですかね?
トークンとして変数であることがかなりの確度で保証されているから、そのまま書くだけで置換されるようにしたのだろう 便利でいいことだ 利便性をどこに置くかの話で、特段、謎仕様でもない 厳密言うんだったら、文字列の生成と連結しか許さなくしてもよかったわけだし
よく考えてあるんだな、角度とか
あれ、Struct で読み込み専用アクセサ作ることってできたっけ?
PerlやPHPほどでないにしても、sigil付きの変数なら#だけでいけるね @var = "an instance variable" print "@var is #@var"
183 :
デフォルトの名無しさん :2011/08/12(金) 08:58:34.84
S = Struct.new(:a, :b) do undef :b= end s = S.new(10, 20) s.a #=> 10 s.b #=> 20 s.a = 100 #=> 100 s.b = 200 #=> undefined method `b=' でよければ。
184 :
デフォルトの名無しさん :2011/08/12(金) 09:03:36.63
s[:b] = 100 や s[1] = 100 は出来るな… []= も再定義して引数チェックしないとダメか。
Ruby において、メソッドを直接除去してしまうのは一般に「できる」と言っていいレベルではない気がしないでもない ちょっと前に調べた限りでは、attr_reader みたいなオプションがあれば楽なんだけど、ないんだよね 代入しないでくださいとでっかくマジックで書いとけという結論になった
何だかんだでクラス作っちゃうのが楽だったり
この言語でゲームとかって作れるんですか?
はい作れます
最初に作ったのは、ヒット&ブローだった。
FPSとか3Dグラが動くようじゃなきゃ『ゲームが作れる』とは言えないでしょういまどき
いいえ、作れません
>>190 ほれ、これで満足かい?
いいえ、作りません。
3Dのも作れるで
3Dというものは存在しない お前は1970年代の新聞か
できるかできないかといわれたらできる あれ?これ何度も見てる気がする
>>194 人間の目が2.5次元しか見えてないんだっけか
特定の3Dオブジェクト表示プログラム用のデータを書き出させることを自力でやろうと思えばできます、みたいな慎重な表現になるな
ライブラリをラップしたやつあるんだって
ゲーム分野はよく知らんのだが、昔のRubyKaigiで StarRubyとかが紹介されてなかったっけ? 軽いゲームなら何とかなりそうだったが
Windows7 64bit Ruby1.9.2p290
下記の画像のコードを実行すると
http://sakurasite.homeip.net/imgboard/img-box/img20110813162555.png 下記のエラーが発生しました
http://sakurasite.homeip.net/imgboard/img-box/img20110813162912.png C:\Users\*>"C:\Users\*\Desktop\tes.rb"
["C:\\Users\\*\\desktop\\文字化け"]#←文字化けの部分は実際は化けてる。念のため置き換え
C:/Ruby192/lib/ruby/1.9.1/fileutils.rb:243:in `mkdir': "\x85\xE3" from Windows-31J to UTF-8 (Encoding::UndefinedConversionError)
from C:/Ruby192/lib/ruby/1.9.1/fileutils.rb:243:in `fu_mkdir'
from C:/Ruby192/lib/ruby/1.9.1/fileutils.rb:204:in `block in mkdir_p'
from C:/Ruby192/lib/ruby/1.9.1/fileutils.rb:201:in `each'
from C:/Ruby192/lib/ruby/1.9.1/fileutils.rb:201:in `mkdir_p'
from C:/Users/*/Desktop/tes.rb:33:in `mkdirR'
from C:/Users/*/Desktop/tes.rb:27:in `getImage'
from C:/Users/*/Desktop/tes.rb:13:in `block in analizeGigazine'
from C:/Users/*/Desktop/tes.rb:9:in `scan'
from C:/Users/*/Desktop/tes.rb:9:in `analizeGigazine'
from C:/Users/*/Desktop/tes.rb:46:in `<main>'
#--ここまで
文字コードはUTF-8です。
rbファイルに直接path="ほげほげ"と書き込んだ時は正常にFileUtils.makedirs出来たのに
Net::HTTPでutf-8のHPを取得し、そのソースから文字を抽出し、その抽出した文字をフォルダ名と指定してFileUtils.makedirsすると
上記のエラーが出る理由が分かりませんでした
rbは以下のURLです。実行すると38行目のパスにフォルダを作るので(これは成功するはず)適当にパスを書き換えて下さい
http://sakuraweb.homeip.net/uploader/src/up156600.zip
Ruby 1.9 のNet::HTTP の HTTPResponse#body は、文字エンコーディングが ASCII_8BIT のままだ 人間が適当に文字エンコーディング情報をつけてやる必要がある ファイルのマジックコメントが UTF-8 だからといって、Net::HTTP で取得するファイルの文字エンコーディングが自動で書き込まれたりはしない(むしろ怖い) analizeGigazine(res.body.force_encoding('UTF-8')) とでも書いとけ 「ファイルパスをWindows-31Jに変換したいと思ったが、 渡された文字列がそもそもどんな文字エンコーディングで書いてあるかわからないので変換できません」というエラーだ
1.9は知らないがUTF-8に"\x85\xE3"に対応する文字がありますんエラーに見える
それはともかくユーザ名が画像の中に入っちゃってるぞ
>>200
>>201-203 rubyは変数に個別に「この文字コードはxxだ」って指定しないといけないのか
ありがとうございます、出来ました
>>203 消した後に気付いて直すのめんどいからまあいいや〜って
いや、普通は継続される UTF-8 のマジックコメントのあるスクリプトファイルに書いた "文字列リテラル" は何もしなくても UTF-8 だし、 UTF-8 の文字列から正規表現や String#scan で抜きだした文字列も(普通は)そのまんま UTF-8 だ Net::HTTP が「なんだかよくわからない外部」から文字列を持ってくるという、Ruby の文字列から見て特殊な動作をしているだけ
継続?
207 :
デフォルトの名無しさん :2011/08/13(土) 21:29:40.36
継承とか伝搬とか、言いたいことは分かった。
208 :
156 :2011/08/14(日) 14:15:07.98
ここの人はだいたい何歳ぐらい? おいらは31歳
209 :
156 :2011/08/14(日) 14:16:01.20
誤爆失礼しました。
Emacs23でruby-mode使って書いています。
(
ttp://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ ここからDL)
たのしいRuby 第3版 P.136のpoint.rb
class Point
attr_accessor :x, :y
protected :x=, :y=
このあとに、\C-j で改行+インデントするとインデントがずれてしまいます。
protected :x=, :y=; のように';'を追加すれば問題ないのですが・・・。
どなたか解決策ご存じの方、教えてください。よろしくお願いします。
OSを再インストールする時、rubyはどこをバックアップすれば元の環境に復元できるのでしょうか そのままrubyフォルダを上書きで大丈夫でしょうか 通したパスやファイルの関連付けは分かるのですが、例えばgemでインストールした機能も正常に動作してくれるのでしょうか
OS とインストール方法を書いた方が良いよ。
>>213 昔からあるバグでしたか・・・。
Emacsの方が古いので、新しいのを試しましたが直ってないようですね。
とりあえずこの問題は置いといて先に進もうと思います。
WINのコマンドプロントで、irbモードにしたときに、コピペが使えるようになる方法はありますか?
>>215 コマンドプロンプトのタイトルバーで右クリック、編集→貼り付け
>>216 出来ました。ありがとうございます!!!!(^ ^)
Rubyではメソッドをネストで定義できますがどういう時に役立つのでしょうか?
ネストで定義はできません 単に「def ... end はメソッド定義機構としてどこででも書ける」だけです def aaa def bbb ... end end は def aaa このタイミングでメソッドbbbを追加する() end と同じような意味しかないです 「aaaメソッドの動作中にメソッドbbbを(現在のselfに対するインスタンスメソッドとして)追加で定義する」以上のなにものでもないです
それがどういうときに役立つか、応用例を聞いているのでは?
aaaの中で定義したbbbはaaaの外からでも使えますか?
メソッドのスコープはクラスにはりつくので、 class Foo def aaa def bbb ... end end end における bbb は Foo#bbb なわけです。
>>220 あとからメソッドの中身を決めたい時とか?(定義しないという判断も含めて)
>>221 使える。
>>222 Foo#aaa#bbb
とかにならないんですか?
>>224 ならない。
Rubyのdef文は関数を作るのではなく、常にメソッドを作る文だからね。
ローカル関数のようなものが欲しいなら、Procクラスを利用する。(proc{}やlambda{}で簡単に利用出来る)
>>220 ぶっちゃけ、これ単体ではあんまりない
まあ。これが機能するからこそ、メソッド名とかをその場で決められる
def aaa
instance_eval "def hoge_#{name}; ...; end"
end
みたいなのが動作するんだけどね
あと、ちょっとでも馴れてる人は def を eval するのはやめて define_method 使いましょう
初回だけ処理するとか。 class Foo def hoge def hoge end puts "The 1st hoge" end end
class Foo def aaa def bbb ... end end def ccc def bbb ... end end end f = Foo.new # bbbの再定義エラーにならず f.bbb # エラー f.aaa f.bbb # 正常(1) f.ccc f.bbb # 正常(結果が(1)と違う) やってみて判りました 馬鹿ですみません
>>228 f.bbb # エラー
何でエラーになるかわからない。
f.ccc
f.bbb
か
f.aaa
f.bbb
の順番だとエラーにはならないのに。
f.bbbを先に書くとエラーになる。
実行していないからでしょ
aaaのメソッドを呼ばない限りbbbは定義されないって事?
class Foo def aaa def bbb end end end f = Foo.new f.bbb f.aaa C:/Users/hi/AppData/Local/Temp/rbDF46.tmp:8:in `<main>': undefined method `bbb' for #<Foo:0x96d4e4> (NoMethodError) Complete(1) こうなるのは仕様なのかな?
仕様。 module とか class は実はその場で実行されてるが、def は、ここから先対応する end までは この場では実行しませんよ、メソッドとして呼び出されたら実行しますよ、というのが Ruby の基本的な設計なので、そのあたりの意味が違ってたほうがいい、というのは、 事実上別の言語を設計する感じになる。
def がネストできるように見えるというこのへんは批判されることがないでもない 便利なんだけど、一見さんには不親切だしキモい 一度理解してしまえば便利なんだけど、ネストの記法でなくてもよかったはずではあるのだ class C def aaa def bbb; end end end p C.instance_methods - Object.instance_methods #=> ["aaa"] C.new.aaa p C.instance_methods - Object.instance_methods #=> ["aaa", "bbb"] きめえ!
>>231 そゆこと。
Rubyのdef文はあくまで「そこに到達したときに、書かれた内容をメソッドとして作成する文」でしかないんだよ。
classやmodule文はそれを作成して、そのスコープで中身を実行するだけ。
だから、def bbbを実行するまではbbbは存在しないんだ。
class は実行文、 def は定義文、と憶えてる。
class Main puts "hello world" end でも、実行されるってことでしょ そもそもincludeやattr_accessor とか単なるメソッドなので 実行されないと困る
負の数を2の補数で16進文字列にしようとすると先頭に..が付いてしまいます。 ..無しで出力する方法はないでしょうか? ruby 1.9.2p180 (2011-02-18) [i386-mingw32] > "%.08x" % -10 => "..fffff6"
意味的にそういうものなので、文字列操作で消すのがいいと思う
補数が欲しいなら、文字列メソッドで取ればいい 補数でなく-0000000aでいいなら、+を付けてそもそも補数表現をやめてしまう
るりま曰く: # 「精度」を指定した場合、".." は付加されません p sprintf("%.10x", -1) #=> "ffffffffff" 嘘ばっかりや
1.8.7 だとそうなるな。 どっかで変更が入ってる。
Rubyは標準で多倍長整数が扱えるので補数表現で限られた桁数に切詰めるのはおかしい という議論がバグトラッキングにあった気がする
---文字列ここから---- ≪書籍情報≫<br> 著者:尾田栄一郎<br> 出版社:集英社<br> 版型:新書版<br> カテゴリー:少年コミックス<br> 連載雑誌:週刊少年ジャンプ<br> 最新刊発売日:2011年8月4日</p> ----ここまで---- 今Mechanizeを勉強しててこの文字列をRubyで処理したいんですが 上記の複数行にわたってある文字列をpとして、 この文字列を<br>で区切って渡したいんですが puts p.scan(/[^(<br>)]+/)とやっても 35:in `<main>': undefined method `scan' for #<Nokogiri::XML::Element:0x27e9358> (NoMethodError) とエラーがでて上手くできない \r\nとか\nを含めて考えてもエラーが出るばかりでうまくいきません どなたかご教授願います(^p^)
>>245 エラー内容からするとpの中身は文字列ではなく
Nokogiri::XML::Element のインスタンスみたいだぞ
まずはそいつから欲しい文字列を取り出さなきゃ
>>245 Nokogiri のマニュアルくらい読め
英語な上に構造が恐ろしくわかりにくいけどな
at (やsearch)の戻り値は Nokogiri::XML::Document オブジェクト(の集まり)だ
String オブジェクトを利用するにはさらに inner_text メソッドか inner_html メソッドが必要
というか、Ruby に関する一般的な知識が不足してるように見受けられる
どこまで「用意」してから臨めばいいのかってのは事前にはわからんしなあ でもまあ > undefined method `scan' for #<Nokogiri::XML::Element:0x27e9358> (NoMethodError) くらい一般的なエラーは読み解いて欲しくはある 「ああ文字列じゃないのか、文字列にするメソッドは何だろう?」くらいは一発でわかって欲しい
249 :
デフォルトの名無しさん :2011/08/18(木) 23:28:47.52
ところで /[^(<br>)]+/ という正規表現は (、<、b、r、>、) 以外の文字の並び だな。
>>246 >>247 おお、inner_htmlつけたらできた
サンクス(^q^)
2日前からRubyはじめたけどMechanize楽しすぎ
rubyである文字列を含まない正規表現ってクソ難しいんだな
Ruby以外では簡単なのか? Rubyでも!~や?!使えば簡単だと思うけど
ある文字列を含む、の not じゃダメな理由を詳しく
>>253 ごたごた細かいこといってんじゃねーよ
お前が考えろ、馬鹿
not じゃダメと判断した理由を聞いているんだから、本人に聞くしかないでしょ。 お前が考えろ、とかいうのはおかしい。
前もどっかで話した気がするが、いっこの「正規表現オブジェクト」として持ち歩けないのはめんどくさいと言えばめんどくさい いつもは if @reg =~ str でいいのに、この場合だけ unless @reg =~ str や if @reg =! str としなければならない、みたいな
だから否定の先読みがあるっつってんだろうがよ
それを一般的には「めんどくさい」と言う
確かに否定の先読みをいちいち設定していくのは俺もめんどくさいと思うが
>>256 は、いっこの「正規表現オブジェクト」として持ち歩けないのはめんどくさいと言ってるからそこ注意な
re = /[abc]/ er = /(?!#{re})./ re =~ "abc" # => 0 er =~ "abc" # => nil こういうこと?
abcdxyzjdusxyzgregregxyzzzzzzz この文字列をxyzで区切るのメンドクサイよね
区切り文字も必要で、しかもくっつけたり独立要素として保持したりしなければならない場合はとてもめんどくさい 区切り文字を捨ててもいいなら気楽なんだけど、そんなことばっかりじゃないしな
>>261 s.split(/xyz/)
s.split(/(?<=xyz)/)
外れてたら欲しい結果も書いてくれ
s.split(/(xyz)/)
splitなんてもんがあったのかよ・・・ scanで一生懸命どうやってやるか考えてたわ
いやsplitでどうやるかという話だろ
最低限の実装すら知らないのに文句言うやつってメンドクサイよね
なんでもいいので、StringとArrayとHashとEnumerableのメソッドは、どこにどんなのがあるか暗記するくらいの勢いで勉強してくだち おーざっぱに用途を覚えるだけでいいです 実際の引数とか戻り値は使うときにマニュアル読めばいいだけなので、そんなのにわざわざカロリー使わないでいいです スクリプト書く効率上、この4つのクラスのメソッドを覚えることは絶対に損をしないので
scan使う場合はどうすればいい?考えてみたんだけど最後に空文字列が入ってしまう "abcdxyzjdusxyzgregregxyzzzzzzz".scan(/(.*?(?:xyz|$))/).flatten => ["abcdxyz", "jdusxyz", "gregregxyz", "zzzzzz", ""]
s.scan(/.+?(?:xyz|\z)/) かなあ いかにもバグってそうで怖くて使えないけど
scanではやらない 以上
linesでデリミネータ指定でも一緒かな
splitとscanはかなり直交してるからな どっちかをどっちかで補うのは至難の業
デリミタ?
"abcdxyzjdusxyzgregregxyzzzzzzz".scan(/(.+?(?:xyz|\z))/).flatten => ["abcdxyz", "jdusxyz", "gregregxyz", "zzzzzz"] "abcdxyzjdusxyzgregregxyzzzzzzz".lines("xyz").to_a => ["abcdxyz", "jdusxyz", "gregregxyz", "zzzzzz"]
クラスを継承する利点ってどういうところでしょうか? 入門書を読んでいると継承せずにスーパークラスになる所に全部書き加えてしまえば良いのではないかと思ってしまうのですが・・・ 何かRubyの質問というよりはプログラミング全般の質問みたいになってすいません。
継承の利点は既に存在してるものに任せることができること、という利点はわかってる
ようなので、「スーパークラスになる所に全部書き加えてしまえば良いのではないか」の
ほうにコメントするけど。
そういうことはJavaではできなかったりするんだけど、Rubyではできちゃったりするけど、
なんでスーパークラスを直接書き換える、ということを普通はしないか、というと、
たとえば String に run_away というメソッドを追加したら、もしかしたら自分の使ってる
ライブラリのどこかが、String に run_away というメソッドがあったらおかしくなるかも
しれない。だから普通は継承したうえでメソッドを追加する。
Matz曰「継承は最後の武器だ」という言葉の通り、
(
http://www.rubyist.net/~matz/20030806.html を見ること)
あまりむやみに使うものでもない、ってのもある。
>>276 子が親を継承しても、(その子以外の)親の利用者は影響を受けない
一方、親を直接変更したらその親の利用者すべてに影響が出る
>>276 継承の必要度は言語にもよるし、やりたいことにもよる。
大規模なクラスライブラリを構築するなら継承は必須だが、少し自作するだけならあまり要らない。
特にduck-typingとmix-inを採用したRubyではあまり乱用すべきものじゃない。
Javaはduck-typingではないが、interfaceを使えば継承はそれほど必要でない。
C++はそれらを継承で賄わなければならないので、必須になるが慎重に行う必要がある。
ういっす 「オブジェクト指向言語」なんてものは実際のところうまく存在し得なくて、 「オブジェクト指向の考え方を導入した独自言語C++」 「オブジェクト指向の考え方を導入した独自言語Java」 「オブジェクト指向の考え方を導入した独自言語Ruby」 でしかないのだな あるオブジェクト指向(の考え方を導入した独自)言語でのやりかたは、オブジェクト指向そのもののやりかたとは違う あくまで現実の実装に引っ張られまくった「C++の文法」「Javaの文法」「Rubyの文法」でしかない
>>277-279 大規模なプログラムを作る時に、思わぬバグを避けるためという感じでしょうか。
なんとなくわかりました。ありがとうございます。
マニュアルには『改行は行が明らかに次の行に継続する時だけ、空白文字として、 それ以外では文の区切りとして解釈されます。』と書いてあるけど、 foo + bar は+の前で改行するとNGで foo.each{…} は.の前後どちらでもOKなのはなんで?
>>282 +の前で改行した場合は、単項演算子(+bar)として解釈されるってことじゃないの
>>282 「記号の前の改行は文区切り、記号の後の改行は空白文字」
を原則にしてくだされ
つまり、改行するなら記号のあと
>>282 行頭の.eachは1.8では通らなかったが、通るようになった
行頭の + bar は
>>283 の通り単項と見分けがつかない
foo
+ bar
は「fooを呼び出し、barの正負をそのままに戻り値とする」と読めてしまうよ
それって.だけ特別扱いなのか? 行頭が2項演算子としか解釈できないものならいけるかと思ったけど 2 ** 3 はダメだった
「記号の前の改行は文区切り、記号の後の改行は空白文字」 を原則にしてくだされ つまり、改行するなら記号のあと
それはいいんだけど、.はなんで前でもOKなのか、 前でいけるのが他にもあるのかが知りたいんです
.も記号なのに前で改行できるって面白いな .は演算子じゃないから+とかとは別なのかな
>>289 ドットは後で変更されたワケだから、どっかに理由載ってるかもね
おまいら - のことを忘れてないか
>>289 ドットと条件演算子は1.9で挙動が変更された
あと、記号の前で改行「してはいけない」
.は特別なのね 皆の衆サンクス
長いメソッドチェーンを複数行で書きたいからとか? . の前で改行できると メソッドチェーンが続いてることがわかりやすいだろうし
いくら改行を入れられるからといって、 改行を入れなきゃいけないほどメソッドチェーンを続けるのは良くないと思いまーす!
> 記号の前で改行「してはいけない」
うむ
>>296 中途半端な変数よりはメソッドチェーンのほうが好ましい場合もある
そもそも「よくわかる変数名」「わかりやすいメソッド名」を使えば使うほど、
zzz =aaa(x,y,z).bbb 程度の処理でもヨコに長くなったりする
まあ、なんかどうしてもメソッドチェーン繋げようとする人も世の中にいることはいるんだが
バックスラッシュで改行を2回消した時点でなにかおかしいかなと思って欲しいところ
変数使え変数
Kernelの特異メソッドはどこからでも呼べますが、どのような仕組みなのでしょうか? 自分で以下のように特異メソッドを定義しても呼び出せません。 def Kernel.my_method end
変数といえば思いだした if aaa && bbb(x).ccc == ddd.eee.fff(y) then ... みたいなのを hoge_condition_is_ok = aaa && bbb(x).ccc == ddd.eee.fff(y) if hoge_condition_is_ok then ... と読み下しやすいような説明変数に帚き出して書くことについての是非プリーズ
「どこからでも呼べる」のは「Kernelの特異メソッド」ではないから。 module Kernel def my_method end end
>>298 いわゆる「関数的メソッド」は Kernel モジュールのインスタンスメソッドで、Object クラスに include されてると思ってくれ
module Kernel
def open(...)
...
end
end
class Object
include Kernel
end
こんな感じ
実際は C で書かれてるから、こういう Ruby スクリプトがどこかにあるわけではないけど
>>300-301 なるほど、そういうことですか。
全てのクラスがObejctを継承しているからどこからでも呼べるんですね。
d
305 :
302 :2011/08/24(水) 11:42:07.09
先生しつもん。 id=>falseして、set_primary_keyで主キー変えてるんだけど、 この場合別途、add_indexしなきゃいけないもの?それとも勝手に張ってくれるもの? あと、railsをどうしてもライルズって読んじゃうんだけど、だめ?
1.9に関する記述を外したときに
Railsスレへのリンクが
>>3 に移っただけかと
つかこのスレも前スレ埋まってから立てられたわけで愉快犯以前の問題だ
それなりに巨大なオブジェクトをファイルに書き込みをする際、 「完了」か「書き込みなし」を保証する方法はありませんでしょうか? 現在のオブジェクトの内容をYAMLで保存する際、 書き込みを途中で失敗するぐらいなら、前回の書き込み内容を保存しておいて欲しいのです。 プロセスを外部から殺されることがあるので、せっかくの保存が消えてしまいます。 # Unixでいう、Ctrl-Cとかで殺されてしまいます... 何か良い案があれば教えて下さいm(__)m
>>310 別のファイル名に出力してからmvするとか。
>>311 でFA
Ruby無関係の、ポピュラーなテクニック
ですな 電源喪失とかの可能性まで考えたら、なんとかして確実に書き込もう、ってのは無駄な努力
314 :
デフォルトの名無しさん :2011/08/25(木) 23:02:46.64
同じファイルシステム内のmvは1システムコール(rename(2))だから、 カーネルレベルではアトミックに行われると思っていいよね? Maildirのtmpからの移動がそんな感じだし。
よっこら
んで
>>314 うん
mv以上に「安全」かつ慎重にやる手段は、通常はない
mvって言うとFileUtils.mvを連想してしまう (こっちはファイルシステムが違うとアトミックにならない) ので、 File.renameと言って欲しいところ。 ところで、元の質問では「Unixでいう」と言ってるけど、 UNIX以外の例えばWindowsなんかでもFile.renameはアトミックなん?
318 :
317 :2011/08/26(金) 11:00:43.00
w3mから書き込んだら改行が無くなったでござる。 聞くだけではなんなので調べてみた。 DOSISHやWin95は多分ダメ。 WinNT以降だとFile.renameのメインの処理はwin32/win32.cのrb_w32_rename()でやってお り、 ここではMoveFileEx()をMOVEFILE_REPLACE_EXISTINGフラグ指定で呼んでいて、 これだとアトミックな上書きになるっぽい。 なのでFile.renameでおっけーと。 間違ってたら指摘してください。
これはスゴイぜ。↓ 竹藪焼けた 伊藤は疎い 天狗の軍手 僕小久保 たいやきやいた 天狗の苦しむシルクの軍手 年末はつまんね AKASAKA けだるき一日生きるだけ やずややずや IKKO OKKI 女子コンパでパン粉所持 ロリコン外科医いい加減懲りろ 世界を崩したいなら泣いた雫を生かせ やきいもおとすとおもいきや ママのリアルなアナルありのまま 野茂の尻もタモリ氏のもの お菓子が好きスガシカオ すきのしるしのきす 旦那もホモなんだ
'aabbcc'[/b+/] => "bb" これは期待通りの結果です。 しかし 'aabbcc'[/b*/] => "" これは何故bbにマッチしないのでしょうか? 'aabbcc'[/bb*/] => "bb" こうすればマッチするのですが、何が起きてるのか理解できません。
bbより先に""(bが0個)にマッチしたのでは?
/b*/ は bが0個以上という意味だから。0個つまりbがなくともマッチする。 'aabbcc' =~ /b*/ #=> 0 なので、aの前の行頭とマッチしている。 bb とマッチしないのは、最初にマッチする場所を返すから。 bの前に何もなければ、'bb'[/b*/] #=> "bb" 'aabbcc'[/bb*/] だけど、*のデフォルトは「欲張りマッチ」なので、できるだけ長くマッチしようとする。 なので 'b' とではなく 'bb' とマッチする。
最左最長ってやつだな
324 :
320 :2011/08/27(土) 01:37:40.04
>>321 >>322 おおなるほど、/b*/だと空文字を含めて何でもマッチしてしまうわけですね。
そしてaの前に""があると認識されてしまうと。。
ちょっと目から鱗でした。ありがとうございました。
325 :
デフォルトの名無しさん :2011/08/28(日) 00:24:16.75
プログラム自体初心者です。たのしいRubyを買って一通り目を通しましたがさっぱり分かりません。 挫折しそうです。 他の分かりやすい入門書は何かあるんでしょうか。それともたのしいRubyを元にしてそこで頑張ってみるべきなんでしょうか。 教えてください。
わからないところをここで聞けばいいよ 一通り目を通せたなら何もかもわからないってことはないだろうし
Rubyに関係なく、プログラミングの勉強するのに読むだけってのがまずダメ。 まずは実際に入力して動かしてみなきゃ。
riというドキュメントツールの使い方について教えてください。 ruby自体はrvmでインストールしたのですが、 riとコマンドするとクラスやメソッドの一覧が表示されるので、riコマンド自体はインストールされているようです。 しかし、表示されるクラスが、SQLite3など別途gem installでインストールしたものだけなのです。 具体的には # gem install libsqlite3 というコマンドでSQLite3をインストールした際に、 Installing ri documentation for sqlite3-1.3.3... Installing RDoc documentation for sqlite3-1.3.3... といった出力があったのでこのタイミングでriのドキュメントがインストールされたようです。 しかし標準のクラスなどをriで参照することができません。 これはどのようにインストールすればいいのでしょうか。
レスありがとうございます。 入力は一部しました。配列やハッシュのページはこれがいったい何の役に立つのかとさっぱり分からずやる気がでませんでした。 Rubyの仕様を教えて貰っても実作のプログラムで配列やハッシュがどのように使われるのかが分かりません。 しかし知識のある正規表現や実際のものを動かすIOやFileは楽しく読めました。 たぶん自分に必要なのはRubyでできることを羅列した逆引きリファレンスなのかもしれません。
>>329 プログラミング自体の初心者さんだな?
配列は多くのプログラミング言語の基本だからね。
配列の特徴は添字(配列名の後の[この部分]な)の中に
式や変数を書けるってこと。
だから、ループと組み合わせれば大量のデータを扱ったり(for i in 0..10 do a[i]=0 end とか)
式を書けば何番目の要素にアクセスするかを実行中に決められるのさ。(a[x+1] とか)
これ以上はプログラミング自体の入門サイトで
配列についての説明を読むことをオススメする。
だいたいどの言語でも扱い方は似たようなもんだから。
たとえば2chのスレッド一覧を定期的に監視して、レス数が急増したスレを抽出したいときには スレッド一覧をスレッドのURLとかをキーにしたハッシュにすると便利だったりする。 たのしいRubyにも配列の実用例は載ってなかったかな。 他のクラスでもよく使われるものだから、配列の章以外でもちょこちょこ登場してた気がする。 eachメソッドとかを通して知らないうちに使ってたりして。
>>329 プログラミングは学校の勉強でも資格の勉強でもない
必要ではないものを学ぶ必要はない
30種類入り工具セットの1つ1つの用途をいちいち実際に確かめたりしないだろ
動作一覧だけ覚えて、詳細は忘れろ
必要になったら、そのとき必ず戻ってくる
それまではプログラミングなんて辛気臭いことは忘れて秋のピクニックでもしとけ
たのしいRubyを初心者にすすめる人いるけど、 あれってRuby初心者にはいいだろうけど、 プログラム初心者向けじゃねーよなとは思う。
しかしプログラミング初心者向けの本というのもあまり無く… 5冊くらい買って、自分の感覚に合うものを自爆覚悟で探してもらうしかないな 対面で教えるなら相手の反応見て話題変えたりなんとでもなるんだけど、 書籍という一方的なかたちになると途端に面倒になる
最近はプログラミングの入門書で言語にRubyを採用してるのが何冊も出てるよね。 例えば・・・、忘れた。
思い出せ。
339 :
uy :2011/08/28(日) 22:17:54.53
dxrubyでもやらせてろカス
ゆとりって言われるのを承知の上で愚痴るんだけどさ・・・ rubyって日本産なのにろくにライブラリのドキュメントが 日本語化されてないよね そのうえマニュアルだって説明不足・・・ わざわざruby使う意味あるのか? 結局ライブラリやその他もろもろ書籍に頼るしかないから 飼料の豊富なphpや英語ができる人ならpythonいくんじゃね?
python最強
342 :
uy :2011/08/28(日) 22:44:13.42
>ライブラリのドキュメントが 日本語化されてないよね そのライブラリが国外産なんだろ? 日本産言語なのに、日本のプログラマーがゴミカスすぎてライブラリをそろえられないゴミカス国家
"ruby".delete("rb") いま気づいた
344 :
uy :2011/08/28(日) 23:05:49.89
>>340 ゴミが何をやってもゴミは結局のところゴミだしゴミでしかない
ゴミみたいなゴミにゴミを捨ててもゴミがそれに気づけるわけも無く
ゴミに目もないしゴミはゴミにすら気づけずゴミゴミしたままのゴミだから
ゴミをゴミと呼ぶことはゴミにたいしてのゴミをゴミにするゴミだったゴミカス
お前みたいなゴミにゴミすらゴミの目の前のゴミ
>>341 ゴミみたいな奴だなゴミは結局いつまでたってもゴミなんだからはやくゴミはゴミ処理場ゴミ
ゴミは人間じゃないゴミはゴミとして扱うべきゴミが何かいってきてもそれはゴミだから
ゴミが何か反論してこうとゴミでいいしゴミがゴミを見下してゴミ社会を作っているのがゴミIT
ゴミによくにたそのゴミカスに月曜日の朝のゴミ収集車にゴミは回収させゴミをなくして綺麗な街つくりをしよう
>>343 ゴミ
>>340 日本で「作られ」た部分は日本語になってると思うが…
標準ライブラリのマニュアルとか日本語だろ
言語本体が日本語ユーザーによって作られたからといって、
外国語ユーザーの作ったマニュアルが日本語になるわけじゃない
Rubyにはそんな機能はない
346 :
uy :2011/08/28(日) 23:43:45.84
>>345 s
はぁ?
342 ここでもういってんのに名に同じこと復唱しちゃってんの?じs
じもよめないごmになの?>
書籍が不満ということは、 オライリーのプログラミング言語Rubyくらいの内容は、 ほぼすべてものにしてるんだろうな。
お前は突然何を言い出すんだ
どこがどう突然なんだよ
>>345 >言語本体が日本語ユーザーによって作られたからといって、
>外国語ユーザーの作ったマニュアルが日本語になるわけじゃない
なんか稀〜に勘違いしてる人がいるよね
日本人が開発したんだから全部日本語だろうと
「全部」ではない
あなたが使うのはおそらくは第三者の作ったライブラリで、それはたぶん英語で書かれているはずだ
いちおう理屈上は、日本語のマニュアルの部分でだけプログラミングすることは可能だが…
>>349 書籍が不満なんてそんな主張してる人いないじゃん。どのレスのこと?
352 :
uy :2011/08/28(日) 23:58:49.90
>>351 ハッァアアアアアアアアアアアアアアア????
どう考えてもさっきから
340の話してんのにそれすら「お前だけ」分からないで横レスしてきてなんでそんなに偉そうなの???????
353 :
uy :2011/08/29(月) 00:00:06.04
>>350 ハァアアアアアアアアアアアア?????
中学生はもう寝ろ
何が
「全部」ではない (キリッ)
だよwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
マジ文章も気持ち悪いし、IQも低そう 市ねゴミカス
354 :
uy :2011/08/29(月) 00:01:47.98
>>349 はぁあ?
>>348 ハアアアアアアアアアアアアアアアああああ?
ここにも文盲がwwwwwwww
もう実は視力うしなってて、機会音声で2ch読み上げて2chやってんじゃないかと思うレベルwwww
>>347 ハア???あああああああああ????・
オライリーとかいうゴミ本まだよんでんの・・・
まじきち が あらわれた どうする? →NG →逃げる →逃げる →逃げる →逃げる →逃げる
>>350 まあ、残念なことではあるのは間違いない
理想論を言えば。自国語のマニュアルくらいはさくっと入手できることが望ましい
自動生成させるにはもう一段階上のコンピュータが必要だけど…
理由のもうひとつは。マニュアルシステムが多国語または言語アドオンに対応してないこと
これがもし「他人が訳すだけ」でマニュアルを維持できるようなモノなら、人気ライブラリの翻訳マニュアルはもっとあったはず
>>352 >>340 はライブラリの日本語ドキュメント不足が不満って言ってるんじゃん
書籍自体に不満があるとは言ってない
GTKの轍を踏めと申すか…
外国の人に日本語対応任すと自動翻訳の結果「だけ」を寄越してきたりするという罠が そんなんいらないから英語の原文ください原文
>>359 書籍に不満があるんじゃなくて、マニュアルが未整備で書籍に頼らざるをえない状況に不満があるって話でしょう
ま、話の本筋は
>>350 のほうなんでどうでもいいけどさ
>>362 で、最後の行でRubyの資料不足を書いてるよな。
当然流れから、ネットも書籍もひっくるめた不足具合のはずだが。
不足というならおまえは出てる書籍の内容はちゃんと理解してるんだろうなということなのだが、
おまえほんとに理解できんの?3行以上の文章は読めないの?
英語くらい読めよ。技術英語なんて単語さえ分かれば読めるんだからさ。
365 :
uy :2011/08/29(月) 01:04:23.82
英語くらい読めよ。技術英語なんて単語さえ分かれば読めるんだからさ。 ウクライナ語くらい読めよ。技術ウクライナ語なんて単語さえ分かれば読めるんだからさ。 アラビア語くらい読めよ。技術アラビア語なんて単語さえ分かれば読めるんだからさ。 チャハル・モンゴル語くらい読めよ。技術チャハル・モンゴル語なんて単語さえ分かれば読めるんだからさ。 ユラツ語くらい読めよ。技術ユラツ語なんて単語さえ分かれば読めるんだからさ。 コイバル語くらい読めよ。技術コイバル語なんて単語さえ分かれば読めるんだからさ。 膠着語くらい読めよ。技術膠着語なんて単語さえ分かれば読めるんだからさ。 エストニア語くらい読めよ。技術エストニア語なんて単語さえ分かれば読めるんだからさ。 上ビチェグダ方言くらい読めよ。技術上ビチェグダ方言なんて単語さえ分かれば読めるんだからさ。 ルザ・レトカ方言くらい読めよ。技術ルザ・レトカ方言なんて単語さえ分かれば読めるんだからさ。 上スィソラ方言くらい読めよ。技術上スィソラ方言なんて単語さえ分かれば読めるんだからさ。 リヴォニア語くらい読めよ。技術リヴォニア語なんて単語さえ分かれば読めるんだからさ。 長沙語くらい読めよ。技術長沙語なんて単語さえ分かれば読めるんだからさ。 北部サーミ語くらい読めよ。技術北部サーミ語なんて単語さえ分かれば読めるんだからさ。 北東コーカサス語くらい読めよ。技術北東コーカサス語なんて単語さえ分かれば読めるんだからさ。 ウドムルト語くらい読めよ。技術ウドムルト語なんて単語さえ分かれば読めるんだからさ。 アリュートル語くらい読めよ。技術アリュートル語なんて単語さえ分かれば読めるんだからさ。 チュクチ・カムチャツカ語くらい読めよ。技術チュクチ・カムチャツカ語なんて単語さえ分かれば読めるんだからさ。 フィン・ウゴル語くらい読めよ。技術フィン・ウゴル語なんて単語さえ分かれば読めるんだからさ。 カレリア語くらい読めよ。技術カレリア語なんて単語さえ分かれば読めるんだからさ。 ヴェプス語くらい読めよ。技術ヴェプス語なんて単語さえ分かれば読めるんだからさ。
366 :
uy :2011/08/29(月) 01:04:49.54
コミ・ペルミャク語くらい読めよ。技術コミ・ペルミャク語なんて単語さえ分かれば読めるんだからさ。 ヴォチャーク語くらい読めよ。技術ヴォチャーク語なんて単語さえ分かれば読めるんだからさ。 ヴェプス語くらい読めよ。技術ヴェプス語なんて単語さえ分かれば読めるんだからさ。 エルジャ・モルドヴィン語くらい読めよ。技術エルジャ・モルドヴィン語なんて単語さえ分かれば読めるんだからさ。 モルドヴァ語くらい読めよ。技術モルドヴァ語なんて単語さえ分かれば読めるんだからさ。 ブルシャスキー語くらい読めよ。技術ブルシャスキー語なんて単語さえ分かれば読めるんだからさ。 シュメール語 くらい読めよ。技術シュメール語 なんて単語さえ分かれば読めるんだからさ。 近年エラム語くらい読めよ。技術近年エラム語なんて単語さえ分かれば読めるんだからさ。 ケット語くらい読めよ。技術ケット語なんて単語さえ分かれば読めるんだからさ。 リンガラ語くらい読めよ。技術リンガラ語なんて単語さえ分かれば読めるんだからさ。 南ンデベレ語くらい読めよ。技術南ンデベレ語なんて単語さえ分かれば読めるんだからさ。 北部ソト語くらい読めよ。技術北部ソト語なんて単語さえ分かれば読めるんだからさ。 ミノア語くらい読めよ。技術ミノア語なんて単語さえ分かれば読めるんだからさ。 純正クレタ語くらい読めよ。技術純正クレタ語なんて単語さえ分かれば読めるんだからさ。 南アルタイ語くらい読めよ。技術南アルタイ語なんて単語さえ分かれば読めるんだからさ。 ショル語くらい読めよ。技術ショル語なんて単語さえ分かれば読めるんだからさ。 エヴェンキ語くらい読めよ。技術エヴェンキ語なんて単語さえ分かれば読めるんだからさ。 オセット語くらい読めよ。技術オセット語なんて単語さえ分かれば読めるんだからさ。 トゥバ語くらい読めよ。技術トゥバ語なんて単語さえ分かれば読めるんだからさ。 オイロト語くらい読めよ。技術オイロト語なんて単語さえ分かれば読めるんだからさ。 ハカス語くらい読めよ。技術ハカス語なんて単語さえ分かれば読めるんだからさ。
367 :
uy :2011/08/29(月) 01:05:25.20
オロチ語くらい読めよ。技術オロチ語なんて単語さえ分かれば読めるんだからさ。 ネギダール語くらい読めよ。技術ネギダール語なんて単語さえ分かれば読めるんだからさ。 ソロン語くらい読めよ。技術ソロン語なんて単語さえ分かれば読めるんだからさ。 突厥諸語くらい読めよ。技術突厥諸語なんて単語さえ分かれば読めるんだからさ。 トルクメン語くらい読めよ。技術トルクメン語なんて単語さえ分かれば読めるんだからさ。 タタール語くらい読めよ。技術タタール語なんて単語さえ分かれば読めるんだからさ。 バシュキール語くらい読めよ。技術バシュキール語なんて単語さえ分かれば読めるんだからさ。 クリミア・タタール語くらい読めよ。技術クリミア・タタール語なんて単語さえ分かれば読めるんだからさ。 ウズベク語くらい読めよ。技術ウズベク語なんて単語さえ分かれば読めるんだからさ。 現代ウイグル語くらい読めよ。技術現代ウイグル語なんて単語さえ分かれば読めるんだからさ。 エイヌ語くらい読めよ。技術エイヌ語なんて単語さえ分かれば読めるんだからさ。 カライム語くらい読めよ。技術カライム語なんて単語さえ分かれば読めるんだからさ。 カラチャイ・バルカル語くらい読めよ。技術カラチャイ・バルカル語なんて単語さえ分かれば読めるんだからさ。 カラカルパク語くらい読めよ。技術カラカルパク語なんて単語さえ分かれば読めるんだからさ。 カザフ語くらい読めよ。技術カザフ語なんて単語さえ分かれば読めるんだからさ。 キルギス語くらい読めよ。技術キルギス語なんて単語さえ分かれば読めるんだからさ。 クムク語くらい読めよ。技術クムク語なんて単語さえ分かれば読めるんだからさ。 ノガイ語くらい読めよ。技術ノガイ語なんて単語さえ分かれば読めるんだからさ。 くらい読めよ。技術なんて単語さえ分かれば読めるんだからさ。 オルチャ語くらい読めよ。技術オルチャ語なんて単語さえ分かれば読めるんだからさ。 ホジェン語くらい読めよ。技術ホジェン語なんて単語さえ分かれば読めるんだからさ。 アル=サイード・ベドウィン手話くらい読めよ。技術アル=サイード・ベドウィン手話なんて単語さえ分かれば読めるんだからさ。
368 :
362 :2011/08/29(月) 01:14:46.18
>>363 日本発って聞いてきたのに日本語解説が欲しけりゃ書籍買え、では
phpやpythonに流れる
>>340 みたいなゆとり(つか初心者)は特に
あー敷居の低い日本語情報が増えるといいですね
つか初心者レスの細部の解釈程度で何でそこまで喧嘩腰なの?びっくりするわ
ASCIIが256倍本フォーマットでnokogiri本とかtreetop本を出せばいいんだ
370 :
uy :2011/08/29(月) 01:29:17.29
(笑) (笑) (笑)
\ ↓ /
(笑)→
>>368 ← (笑)
/ ↑ \
(笑) (笑) (笑)
プギャーwwwwwwwwwwww
>>369 ライトノベルの会社に過剰な期待をしちゃいかんよ
>>364 ・ 我々がふだん必ずしも定型の技術日本語でマニュアルを記述してはいないのと同様、
どっかの複数人の誰かがよってたかって作った英語マニュアルが技術英語できちんと書かれているとは限らない
・ マニュアルがライブラリ初心者に有用であるとは限らない(クラスやメソッドはマニュアル見せるために分かれているのではないから)
・ 本当に必要だったのはREADMEや(外部の)HOWTOの翻訳や日本語情報だったりする
ということで、普段よく見るその指摘はわりと的外れだ
ちなみに、日本語情報をブログなんかで公開しても、1年後には時代遅れまたはむしろ害悪になってたりもする
適度にキャッチアップし続けないと意味がないのは、難しいとこだと思う
TCL/TKと比べて優れているところはどこですか?
>>373 tkはRubyからでも使えるので、Tclに対する利点を挙げると
・オブジェクト志向が言語レベルでサポートされている
・Perlゆずりのテキスト処理能力
・式やリストやハッシュを手軽に扱える
辺りがパッと思い付くかな
>>372 最近話題になったのだとNet::HTTP.version_1_2みたいなもんか
2011年になってもまだ書いてる人がいるしな
「おまじない」ではなくきちんと「Ruby1.6用」と説明しててくれればよかったのに
376 :
デフォルトの名無しさん :2011/08/29(月) 07:50:33.89
ヒアドキュメントの配列ってどう書いたらいいの。 [ <<_A hogehoge _A , <<_A jajaja _A ] みたいに書いても構文エラーになるんだけど。
とりあえず、こうした。 aas = [] aas << <<_A hogehoge _A aas << <<_A jajaja _A
>>376 a = [<<H, <<HH]
111
H
222
HH
p a #=> ["111\n", "222\n"]
380 :
デフォルトの名無しさん :2011/08/29(月) 08:45:58.53
>>376 [
<<_A,
hogehoge
_A
<<_A,
jajaja
_A
]
moduleの名前の衝突を、皆さんはどのように解決してるのでしょうか? A#echoは知っているのにB#echoの存在を知らない場合、 意図したものとは違う結果が出てしまいます。 module A def echo puts 'A' end end module B def echo puts 'B' end end class C include A include B end hoge = C.new hoge.echo # => B また、上記の場合、hogeからA#echoを呼ぶ方法はあるのでしょうか?
aliasで別名を作れば、別名のほうは上書きされないことを利用し class C include A alias a_echo echo include B end hoge = C.new hoge.a_echo # => A ってのじゃ…ダメ?
>A#echoは知っているのにB#echoの存在を知らない場合 無意味な仮定 以上
385 :
デフォルトの名無しさん :2011/08/29(月) 16:06:35.21
二次元配列で列の数を返してくれるメソッドはありますか?
二次元配列は標準ではオブジェクトとして存在しない ので、通常は単に配列の配列として処理する m = [[1,2], [3,4]] p m.map{|r| r[0]} #=> [1,3] Matrixクラスが存在することはするんだが、おそらく用途は満たさないだろう
まあ確かにミキシンしておきながら結果に文句言うとかありえないのは責務上確かなんだが
>>382 include したあとでは残念ながらできない
include する前に(またはincludeそのものを)なんとかしてくれ
388 :
デフォルトの名無しさん :2011/08/29(月) 16:33:31.94
いえ、そうではなく列のサイズを返してくれるメソッドです 例えば[[1,2,3],[4,5,6]]の時に3と返ってくるような
ありがとうございます
モジュールだけのメソッドがあるの?
>>391 「Ruby module Mix-in」あたりでぐぐって自分で調べてよ。
>>382 メソッドを取り出して、それにオブジェクトをバインドするとか
A.instance_method(:echo).bind(hoge).call
モジュールがクラスの一種なのですか? クラスがモジュールの一種なのですか?
さびしいからって人を集めようとするなよ
$ ruby -e 'p Class.superclass' Module
397 :
382 :2011/08/29(月) 19:52:19.66
>>383 >>384 >>387 コメントいろいろありがとうございます。
Mix-inする人が責任を持つべき事柄なのですね。
例えばmodule内のインスタンス変数を初期化できるinitというメソッドを定義した場合、
他のmoduleでもinitを定義している可能性を考えて悩んでいました。
# moduleに状態を持たせるのも正しいかどうかよくわかってないのですが..
使いやすい設計ってのがなかなか判断つかないですねぇ...
過去に数回挫折したけど再挑戦します。 1.8.7と1.9.2、どちらを学ぶべきでしょうか。 目標は、データベースを使ったcgiの公開。 又、お勧めの開発環境も助言戴きたく。 現状は、昨年、市の火災情報を1分毎に取得し、 特定の文言があればログに記録、登録者にはメイル、 という物を目論んで、ログに書くところまで出来ました(ローカルで)。 ※市が同様のことを始めて頓挫 htmlとcssは手打ち可ですが、プログラミングはRubyが初です。 「たのしいRuby」第2版(1.8.4)と、rails(1.8.6)の書籍を所有。 10.4搭載の古いMacで作ってましたが、 win7 starterのネットブックでやりたいです。
>>397 言語レベルで何らかの支援が必要だという話はあるんだが
まだうまい解決策が定まっていないのと、経験的に
・それほど頻繁に名前は衝突しない
・もし衝突していたら明らかに挙動が変わるのでテストで気づく
というわけで、極端に神経質になることはないかと思う
>>397 >module内のインスタンス変数を初期化できるinitというメソッドを定義した場合、
>他のmoduleでもinitを定義している可能性
それはないでもないが、initみたいなのがあるモジュールを2回以上includeする機会はたぶんまず無いと思う
ぶつかったらぶつかったとき考えたいなあ
まあわりとどうでもいいんだけど
>>398 >市の火災情報を1分毎に取得し
それが迷惑だったから自前で似たようなサービス公開したんだと思う
ものにもよるが、1日に1400回フルでHTMLを取得してる人が来たら俺ならちょっと考える
で、まあ、RailsやるならいまのところRuby1.8.7しか選択肢がない
Rails2とRuby1.8.7の両方に造詣が深いならRuby1.9.2でもいいけど、要件として不整合だな
開発環境は使い慣れてて色つけと自動インデントのできるエディタならなんでもいいです
Rubyのために別途開発環境をインストールするなんて愚行はおやめなさい
天災現る
>まあ、RailsやるならいまのところRuby1.8.7しか選択肢がない え?
彼は1.9に(逆)恨みがあるんだよ Windows版のインストールで配布元に難癖つけて、 一時Windows版の配布が止まったくらい。
p BasicObject.superclass p Object.superclass p Module.superclass p Class.superclass nil BasicObject Object Module Complete(0)
今ならRails3と1.9.2が普通じゃないか?
railsはこれからは1.8.6以下をサポートしません。
Prototype.jsは非難されるのにActiveSupportは歓迎されるのがわからない
prototype.jsってそんなに非難されてるか?
派遣がもうJqueryにうつったし、Pjaxに時代がうつるし、prototype.jsは過去の遺物レベル。
ばいばい
prototype.jsってperlみたい
CSS構造化のLESSをgemで導入したいのですが gem install less とすると Failed to build gem native extension. というエラーで出来ません。 どなたか解決方法知っている方いたら教えて下さい。 WindowsXP、Ruby installerで 1.8.7 1.9.1 1.9.2 それぞれでやってみましたが同様です。
2.0.0以降はダメっぽいぞ gem install less --version 1.2.21
>>416 おー、出来ました!ありがとうございます!
最近は主軸がnode.jsに移ったらしくもうRuby用は捨てられて
しまったのか?とか思いつつ、バージョン指定とか分かりませんでした。
助かりました!
>>410 海外じゃprototypeの方が主流ってどっかで読んだんだけど、何で日本じゃ流行らなかったんだろ。。。
419 :
デフォルトの名無しさん :2011/09/01(木) 22:37:07.57
諸兄の知恵と知識で助けてください。 Ruby 1.8で書かれたWinXP向けのアプリを改造しなければならなくなって、 今までは仮想COMとやらでシリアルだったのがDLL呼び出しになりました。 ネットで調べてみたんですがRubyでDLL呼び出しの仕方の情報があまりなく、あっても今ひとつ判らないです。 エクセルのVBAでカンタンなツール作るぐらいはできます。 その程度でもなんとかできそうなぐらいに分かりやすく書いてるサイトや書籍、心あたりあったら教えてください。
423 :
419 :2011/09/02(金) 14:42:06.01
ありがとうございます。 何とかなりそうです。
RDE(with Active Scriput Ruby 1.8.7)を使っていると、突然 システムリソースが足りません、Access violation at addressなんちゃら、canvasを描画できません などなどのエラーメッセージが次々に出てきて操作不能に陥ることが良くあるのですが、これって仕様ですか?
まあ、RDEだし…としか 初心者でRDE使ってる人はいないんじゃないかな?
いやいると思うよ
とりあえずIDE環境を探してRDEにたどり着く人は多そう
IDEなんていらないってことに気がつくと使わなくなるけど
>>424 数年更新されていないソフトなのでしょうがない
427 :
uy :2011/09/02(金) 19:07:34.27
最初の1時間は落ちないんだから 1時間以内に組みたてりゃ良い話だろゴミかお前
>>426 そーなのですかー・・・
今は主流はRDEでは無いのでしょうか?やはり時代はイクリプス?
イクリプス=Java というイメージがあるのですが
429 :
デフォルトの名無しさん :2011/09/03(土) 08:36:40.94
vimじゃね?
redcarとか。
sublime textは?
Ruby用でまともに使えるIDEってないよね。 ただ書くだけならNetBeansが設定含め楽でいいかなとは思うけど、 テストだったり、Railsの追従って点で見ると、どのIDEもやる気ない感じ。 で、みんなVim/Emacs+Screen+Growl系で頑張ってるんじゃないかなぁ。 Windowzerはどうやってんのか知らんけど。
emacsだろ
やる気ないというか、Rubyの性質上ものすごくめんどくさいということが露見してしまったので、 誰もサポートやろうとしなくなったというのが正解
ありがとうございます。 今は時間が無いのでこのままRDEで頑張ろうと思いますが 後でそれらのIDEもためして見ます。 ところで変数のスコープについてなのですが 下のようなプログラムで、メソッドbとその中で入れ子になっているメソッドの中だけで参照出来る変数vを扱いたいのですが bの中でローカル変数で定義すると、cの中で参照出来ませんし(逆も)、 かといってインスタンス変数で定義すると、b以下と全く関係無い同じインスタンスのメソッドaから参照出来てしまうので困っています bから、cを呼び出す際にcに対して引数として与えるしか方法は無いのでしょうか? class A def a 〜 end def b def c 変数vについての処理 end 変数vについての処理 end end
436 :
uy :2011/09/03(土) 12:57:54.13
>>435 やっぱりただのゴミだったんだな
class A
def a
v = nil
d =lambda do
v = 9
end
d.call
p v
end
end
A.new.a
437 :
uy :2011/09/03(土) 13:05:38.37
ゴミは何をやってもゴミ
>>435 メソッドは入れ子にできない
bもcもクラスAのインスタンスメソッドにしかならない
で、仮にそのへんわかんなかったとしても、
Rubyの変数はオブジェクトにつけられたラベルのようなもので、
なおかつローカル変数はメソッドを越えられず、
メソッド定義は定義だけでは動作しないので
class A
def b
v=1
def c(v); p v; end
c(v)
end
end
とか書くはずで、これならたまたま動く
後定義型(cメソッドを使ってからその後ろのほうでメソッドを定義するタイプの書き方)だと動かないけどな
そもそも「ひとつのメソッドからしか呼ばないメソッド」を作ることに抵抗感ないからなRuby 「メソッドにするからには共通処理であるべき」なんて考えはさらさらない(逆はあるが) 1回だけ呼ばれるメソッドや1個だけ作られるオブジェクトのためのクラスがザラにあるのがRuby しかもpublicだったりするので、Javaとかの潔癖さんが発狂したりする
ありがとうございます。
>>436 でlambdaを始めて知り、いま調べてみて、試しに以下のようなプログラムを書いてみました
やりたいことはだいたい出来るような気がするのですが、
Test1でcの前で定義した変数xはc内でも参照でき、cの外(かつbの中)でもcで操作した値は変わらないことが分かったのですが、なぜcの後ろでxを定義するとその後呼び出したcで参照出来ないのかが分かりません
x=0をc=Proc.new do〜end前に置くとcの中でxをいじることができたのですが、後ろに置くといじれませんでした。
cの後ろにおいた変数をcの中で参照するにはxをcに引数として与えなければいけないみたいですがそうするとcの中でいじくったxをcの外で参照できません
PASCALでいうところのprocedure c(x)みたいな感じにしたいのですが・・・
class Test1
def a
p x
end
def b(step)
x = 0 #cの後ろに置くとダメ?
c = Proc.new do |step|
x = step
if x < 100 then
c.call(step)
end
end
c.call(step)
return x
end
end
v1 = Test1.new
p v1.b(2)
# v1.a #=>エラーを吐く(aからbのxを参照できないことを確認)
>>441 ローカル変数と、インスタンス変数の狭間で困っているのですが・・・。
bで定義されたローカル変数だと、cで参照できない、インスタンス変数だと、bでもcでも参照できるが全く関係ないaで参照できてしまうということです
とりあえずやりたいことはこれでできると思うけど 最終的に何がやりたいか書いてもらったほうがうまく説明できると思う class T def closure b = lambda do |x| p x.x x.x = 10 p x.x end callByReference = Struct.new(:x) x = callByReference.new(1) p x.x b.call(x) p x.x end end t = T.new t.closure
injectという便利なメソッドがあるよ
ああ、連鎖あぼーんの対象になって見てもらえない可能性が高いから、名前欄に何か書いてあるレスは参照しないほうがいいぞ
>>440 違う環境においてメソッドbの環境で実行したいなら環境を引数に取ってevalを使うしかないかな?
def b(step)
c = Proc.new do |bind|
eval <<-EOS, bind
x = step
if x < 100 then
c.call(binding)
end
EOS
end
x = 0 #cの後ろに置くとダメ?
c.call(binding)
return x
end
>>442 aで参照できたっていいじゃん
俺も最初の頃そういうのでごちゃごちゃ考えたことあるけどさ、結局参照できたって参照しなきゃいいだけの話で
そんなところにこだわる暇があったら処理自体とか変数名とか気にしたほうがいいだろ
たとえばsearch_text(text, word)ってメソッドから@img_widthが参照できたとして、普通に考えたら使わないのは一目瞭然なわけで
448 :
uy :2011/09/04(日) 03:15:45.76
>>440 初心者なのにそこに目を付けるとかセンスもってるじゃん
貴様の疑問点は的を射てる
449 :
uy :2011/09/04(日) 04:17:06.94
lambda周辺のつくりはRubyに限らず甘い 将来的に正される場所だと思っている 貴様が言語設計者になったつもりで、 その部分をどういう書き方にすれば自然になるかを考えるがよい
初心者がlambdaがどうこう考えるかよ
とりあえず今は知ってることが少なすぎて細かいこと考えてもしょうがないような気がしてきたので 後でProcとかlambdaのあたりをちゃんとやったときに改めて考えることにして先に進もうと思います みなさんありがとうございました。
あ、あと
>>440 でx = stepじゃなくてx = stepの間違いでした
あれ、書くときに消えちゃうみたい・・・ 全角なら大丈夫かなぁ =じゃなくて+=です
454 :
デフォルトの名無しさん :2011/09/04(日) 08:48:59.60
以下の現象で1週間ほど悩んでいます.何か分かりましたらご教示をお願いします.
コードは以下です.
def do_crawling(logger, uri)
Net::
HTTP::Proxy ($proxy_addr, $proxy_port).start(uri.host, uri.port) do |http|
request = http.get(uri.request_uri)
request.basic_auth(USER_NAME, PASSWORD)
結果は以下です.
/usr/local/lib/ruby/1.9.1/net/http.rb:1102:in `request': undefined method `set_body_internal' for #<Net::HTTPUnauthorized 401 Unauthorized readbody=true> (NoMethodError)
401 Unauthorizedが出ているということは,urlにアクセスはできているということだと思いますが,
basic_authの認証に失敗します.ユーザ名,パスワードに間違いはなく,端末から,curlで接続すると
普通にアクセスできます.
455 :
uy :2011/09/04(日) 09:16:31.54
バグだろ 通報しろ if proxy_user() req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl? end req.set_body_internal body たぶんSSL使われてるとバグるんだろ
456 :
454 :2011/09/04(日) 09:28:26.40
>>455 ありがとうございます.
通報してもたぶん無視されて先に進まないと思いますので,
現状の対応策があれば教えて頂けませんか?
初心者につき,申し訳ないです.
458 :
uy :2011/09/04(日) 09:35:57.84
>>456 手段1
俺のRubyでは
http.rb:1102: にコードはかかれてなくコメント行だった
つまりバージョンごとにファイル内容が微妙に違う
どこのRubyをインストールしたかはわからないが、別バージョンRubyだったら動く可能性は僅かにある
手段2
もうひとつの方法はNet::
HTTP::Proxyと同じことできるライブラリをgemsから探してなんとかする 貴様が何をやろうとしているのかは知らないが、mechanizeではプロキシー経由するコードは動かした事はある
>>457 というか、仮に出鱈目なこと書いてあっても助けてあげることも検証してあげることもできないからな
間違ったまま帰りたくなければそもそも表示しないでおくことが最善
460 :
デフォルトの名無しさん :2011/09/04(日) 10:07:02.86
>>456 >通報してもたぶん無視されて先に進まないと思いますので
なにこの勝手な決めつけ
461 :
uy :2011/09/04(日) 10:15:00.24
>>457 ,459
ハァ?
ゴミが朝から元気じゃん
俺にレスをさせる暇も与えずとっとと答えりゃいいのに誰も答えられない()
どちらが上かくらいわかって欲しいかな^^;;;;;;;;;;;;;
>>460 ハァ?
初心者のぼくにも1分でわかるよう通報フォーム案内してくださいよおおぉぉ^^;;;;;
>>454 http.get しちゃってから basic_auth してもダメじゃない?
Net::
HTTP::Get オブジェクト生成してそれに対して basic_auth しないと。
リファレンスマニュアルの library net/http の「Basic 認証」のとこよく見て。
463 :
454 :2011/09/04(日) 11:39:53.71
皆さんありがとうございます.
>>462 request = Net::
HTTP::Get.new (uri.request_uri)
Net::
HTTP::Proxy ($proxy_addr, $proxy_port).start(uri.host, uri.port) do |http|
request.basic_auth(USER_NAME, PASSWORD)
http.get(uri.request_uri)
いろいろ調べて上のようにしてみましたが,今度はエラーも帰ってこず,無反応です.
初心者なもので,もう少しヒントをいただけると幸いです.よろしくお願いします.
>>463 そこまでいったらもうひといきだべさ。
Net::HTTP とかは登場するクラスの種類がいっぱいあるので混乱すると思うけど、
そこは、引数に与えるべきクラスはどれか、メソッドを呼んで返ってくるクラスはどれか、
そのクラスで呼べるメソッドはどれか、などを、
いちいち p メソッドでクラスを確認したりしていくようにすると良いんじゃないかな。
たとえば
>>454 の例外メッセージを見ると、
request が返るべきところに Net::HTTPUnauthorized クラスのオブジェクトが返ってきてて、
これなんか良いヒントになってたはず。
Net::
HTTP::Proxy ($proxy_addr, $proxy_port).start(uri.host, uri.port) do |http|
request = Net::
HTTP::Get.new (uri.request_uri)
request.basic_auth(USER_NAME, PASSWORD)
response = http.request(request)
response.body
end
465 :
454 :2011/09/04(日) 15:06:50.47
>>464 ありがとうございます.
その後も調べていろいろやったのですが,うまくいかないですね..
proxyを経由する場合は,
http://l-w-i.net/t/ruby/net_001.txt にあるように,
request = Net::
HTTP::Get.new (uri.request_uri)
とするのではなく,
request = http.get(uri.request_uri)
とするようなのですが,それだと464さんのご指摘のとおり,
Net::
HTTP::Get.new (uri.request_uri)をしていないので,
http.get しちゃってから basic_auth していることになっています.
Net::
HTTP::Proxy ($proxy_addr, $proxy_port).start(uri.host, uri.port) do |http|
request = http.get(uri.request_uri)
#request = Net::
HTTP::Get.new (uri.request_uri)
request.basic_auth(USER_NAME, PASSWORD)
http.request(request) do |response|
現状,上のようなコードでうまくいきません.
proxyを超えつつ,basic_authも超える方法がどう考えてもわかりません.
いろいろ検索したのですが..
>>465 > request = Net::
HTTP::Get.new (uri.request_uri)
> とするのではなく,
> request = http.get(uri.request_uri)
> とするようなのですが,
いや、だから http.get で返ってくるのは request (HTTPRequest オブジェクト) じゃなくて
response (HTTPResponse オブジェクト) なの。
response オブジェクトに対して闇雲に request オブジェクトのメソッドの
basic_auth 投げてもそれはうまくいかないよ。
http.get は、 http.request(Net::
HTTP::Get.new (...)) の略記法みたいなもので、
認証の無い場合はその URL の方法で良いんだけど、
認証が必要な場合には、 Net::
HTTP::Get.new して basic_auth して http.request して、
っていうふうにしないといけない。
で、手元では
>>464 に挙げたコードでうまくいくんだが、どんな結果 (エラー) になるかね?
複数ファイルをリネームしたいもですが"piyo-"が二回でてきてちょっと冗長になってしまいます File::glob("C:/**/piyo-*.exe").each {|f| File::rename(f, File::dirname(f) + $1) if (f =~ /.*piyo-(.*)/) } なにかかっこいい書きかたありますか?
経験上、ファイル操作のファイル名マッチングは多少冗長なほうがいい 1行短かくするたびにバグがひとつ増えると思ったほうが
>>467 perl -MFile::Find -e 'find sub{rename $_, $1 if $_ =~ /piyo-(.+\.exe)/}, @ARGV' C:/
470 :
454 :2011/09/04(日) 22:02:29.17
>>466 お忙しいと思いますが,ご親切にありがとうございます.
Net::
HTTP::Proxy ($proxy_addr, $proxy_port).start(uri.host, uri.port) do |http|
request = Net::
HTTP::Get.new (uri.request_uri)
request.basic_auth(USER_NAME, PASSWORD)
http.request(request) do |response|
としているのですが,認証はうまくいっているのかもしれませんが,どうもresponseが
帰ってこないです..proxy無しだと,すぐ帰ってくるのですが..
>>467 Dir.glob("C:/**/*.exe") {|f|
File.rename(f, File.dirname(f) + $1) if /\/piyo-(.*\.exe)\z/ =~ f
}
余計なお世話かもしれないけど、File.dirnameで末尾の/を削った状態で + $1してるけど、
このままでいいんだよね?
FIle.dirname("aaa/bbb") # => "aaa"
472 :
454 :2011/09/05(月) 04:37:52.79
>>466 今,結果を確認しましたら,responseが帰っていました!これで一つ知識が増えました.ありがとうございました.
>>476 それ途中のディレクトリに「piyo-」があったらおかしくなるよね
まあ無い事が前提なんだろうけど中途半端なスクリプトで
かっこいい書き方とか考えるより、冗長かもしれないけど
読んで意味のわかる書き方を身につけた方がいいと思うぞ
File.glob("C:/**/piyo-*.exe").each do |filename|
dirname = File.dirname(filename)
basename = File.basename(filename).sub(/piyo-/,'')
File.rename(filename,File.join(dirname,basename))
end
ワイルドカードと正規表現と、似て非なるものを同じ目的に使おうとしてるから、 冗長になってしまうのは仕方ないよね。 どうしてもパターンを共通にしたいとすると Find で正規表現でマッチしてまわる、 とかになりそうだけど、それはそれで面倒そうだし。
質問です。 ブロックは中括弧を使って表現することができると思いますが、 文字列中の中括弧#{some_variable}や、 連想配列で使う中括弧{ name => 'John', age => 25}はブロックの仲間ですか? それともただ単に中括弧を使っているだけですか?
うん、ただの波括弧(中括弧という言い方は最近はしないし、紛らわしいのであまり勧めない)の流用 記号が少ないのでこんなことに
>>476 なるほど、ありがとうございます。波括弧も気をつけます。
連想配列の方はともかく、文字列中の#{some_variable}に関しては、
変数の埋め込みだけでなくRubyの式を好きなように入れられるようなので、
てっきりブロックの仲間なのかと思いました。
ありがとうございました。
昭和に生まれた人は大括弧や中括弧という言葉を算数(や数学)で使ったはず 今はあまり使わないんだ
マジで?今はなんて?
かくかっこ・なみかっこじゃないん? そもそもブレースが2番目の括弧なのは日本くらいだろ 大学でいきなり世界のデファクトスタンダードの { [ ( ) ] } になって困惑した人は多いはずだ
>>404 kwsk
>>432 開発当初からIDEの利用を前提としている言語とそうではない言語の違いは仕方がないんじゃ
IDEを使いたい人はテストや、Railsを使う時にこそIDEが欲しくなるかもしれんが、さすがに流れが早すぎる
IDEの開発者に同情する
stringからcomplexに変換するのって 自分でメソッド定義しなきゃダメですか?
483 :
デフォルトの名無しさん :2011/09/06(火) 21:57:30.13
> RUBY_DESCRIPTION => "ruby 1.9.4dev (2011-09-03 trunk 33167) [x86_64-darwin11.0.1]" > '1.0i'.to_c => (0+1.0i) 1.9のいつごろからあるかは知らない。
いけたよ〜 ruby 1.9.2p180 (2011-02-18) [i386-mingw32] >irb irb(main):001:0> '1.0i'.to_c => (0+1.0i)
485 :
432 :2011/09/06(火) 23:36:21.37
>>481 確かにそうなんだけどなぁ。
Win機でこれ!って簡単に進められないのは痛いよ。
別に世界中の誰にも使って欲しいとは思ってないけど、
ある程度間口が広がらないと、企業では排除されるんだよね。
RubyWorldConferenceである人と話したんだけど、
テロ的に、「いやもうこれ(Ruby/Rails)でやっちゃいましたよ」的な既成事実で
攻めるしかないってどうよって思った。
というか完全にスレ違いだね。ごめん。
・rubyはwindowsに対応しておりません。
padrinoの話題ってこのスレでいいのかな padrinoって、プロジェクトの生成時に アダプタやDBエンジン、ビューなどの種類を指定するようになってるけど そのとき設定したものを、あとから別の物に切り替えることってできますか? (例:最初にActiveRecordを使うように設定し、途中からSequelに切り替える)
>>487 それくらいの切り替えはできるけど、データベーステーブルの構造を切り替えるとか、そういうことまではしてくれない。
あとactiverecordより最初からsequelやるのがおすすめ。英語必要だけど。
程度の低いやつだな
知らんがな やってみてダメなら無いんだろ
Classの特異メソッドnewはどこにあるのでしょうか? p Class.singleton_methods # => [:nesting, :constants]
newというメソッドはない クラスをnewする行為はRubyで特別扱いされていて、initializeが呼ばれる そんだけ
そうそう だから、newという名前のクラスメソッドを作るとRubyが発狂する irb> class Object; def Object.new; puts "new!"; end; end ruby-1.8.7-p334 :002 > "str" /home/ch2/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/irb/ruby-token.rb:104:in `new': stack level too deep (SystemStackError)
いや、new メソッドは特異メソッドじゃなくて、Class#new だから。
Object.methods (あるいは Class.methods )で :new も出てくるでそ。
>>494 まだ半分 Java 脳?
特異メソッドのほうのnewもその特異クラスの中では存在しているように見えるけど、どうなんだろう? class << Class alias org_new new def new print "Class.new is called" org_new end end Class.new
singleton_methodsのCソースを見た。 rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj) (class.c) ここから呼ばれる実際に検索している関数method_entry(class.c)で、ID_ALLOCATOR(newのこと) だとスキップしてる。だから実在はするけど、singleton_methodsでは見えない。 method_entry(ID key, const rb_method_entry_t *me, st_table *list) { long type; if (key == ID_ALLOCATOR) { return ST_CONTINUE; } if (!st_lookup(list, key, 0)) { if (UNDEFINED_METHOD_ENTRY_P(me)) { type = -1; /* none */ } else { type = VISI(me->flag); } st_add_direct(list, key, type); } return ST_CONTINUE; }
def foo def bar puts :bar_called end puts :foo_called end というコードでテスト中にちょっと内部のbarを直接呼び出したいんですが うまいやり方ってありますか? foo.bar とやってみたところ foo_called bar_called というよくわからない結果になってしまいました。
そもそもメソッド内のメソッドは君が想像してる物と別物。 ただ単純にfooが実行された時にbarを定義するという意味でしかない。 つまり、↑のコードは 1. def fooによりObject#fooが定義される 2. foo.barのfooの部分でObject#fooが呼ばれる 3. def barが実行されるためObject#barが定義される 4. puts :foo_calledによりfoo_calledが出力される 5. puts :foo_calledはnilを返すためfooの返り値はnilになる 6. foo.barに戻る。実際はfooの帰り値はnilなためnil.barの意味。よってObject#barが呼ばれる 7. メソッドbar内でbar_calledが出力される という風に実行される。
んむ、オブジェクトに関する理解がまだないんだと思う メソドチェーンは処理そのものの連なりではない
>>495 しんでるのはirbのtokenizerだけだろ
ファイルから直接読ませればなにも影響ない
>>498 特異クラスもClassインスタンス
>>499 ID_ALLOCATORはClass#allocateだからClass#newとは別物
>>503 なるほど、Class.newもSomeclass.newも同じClass#newが呼ばれてるね。
Classの特異クラスに元々newという特異メソッドはないね。
Class#newでレシーバーがClassなら(無名)クラスを作って、
そうでない場合は通常のインスタンスを作ってると。
Rubyで実装するとこんな感じかな。
class Class
def new
instance = allocate # allocate内でクラスか通常のインスタンスを生成
instance.instance_eval{ initialize }
instance
end
end
HPC Rubyがすごいぞ、ほぼCと同じ速度で動くってよ、 現在の最新Rubyの100倍以上の高速化だぞ。
研究会報告なら大学図書館とかにある所もあるかな
図書館が論文購入費用に長年悩まされているって話を最近見たな、 もう何百年も前から学会が論文に高い値段つけて売っているとか
非会員 : \630-・・・まぁこんなものか。
510 :
デフォルトの名無しさん :2011/09/10(土) 01:23:59.34
>>508 売りつけてるのは学会じゃなくて出版社じゃなかったっけ?
印刷やめて全部電子化して、必要な人だけオンデマンド印刷とかにすれば、 今よりずっと安くなる気がするんだが、それだとやっぱり箔が付かないんだろうか。
Rubyが速くなるのはうれしいけど HPCのような純粋に速度を求められる分野は普通にCやアセンブリでやったほうがいいのでは
何百台のマシンにタスク振り分けたりまとめたり、という、 ・そこまでアセンブラで書いてたら頭が痛い ・汎用ライブラリでは性能が出ない というタイプのコードが近年のHPCでは無くてはならないものになってますので。
でも何故Ruby?っていう。もっと向いた言語がありそうなのに。
515 :
デフォルトの名無しさん :2011/09/10(土) 10:52:11.03
Erlangとか? (てきとうにいってます)
>>511 団体運営の貴重な収入ですので、そう安易に値下げするわけにもまいりません
ただでさえ年会費払うような会員が減っていってるのに
初心者の質問はどこですか?
初心者さんのご来場まで今しばらく歓談でお待ちください
本当にRubyならいいけど どうせ妙な制約が付きまとうんだろ
人間が設定する必要がある部分がすこしずつ減っていっているだけだ。 コンピュータは賢くなっていって最終的には
バカになる
まぁ脳型コンピュータが実現すれば、コンピュータは人間の支持なしで解決すべき問題を自分で見つけて解決出来るようになるだろう。 宇宙の根源も、世界の理も、これからはアインシュタインのような科学者ではなく、コンピュータが導き出す時代になるのさ
それは人間と何が違うんだ?
>>523 人間と違って、物忘れもしないし、計算ミスもしないから、求めるべき解を、最も早くそして最も確実に求めることができるのさ
忘れる機能を組み込まないと、 脳型コンピュータは実現できないかもしれんぞ。 忘れるというのはすごく重要な機能だと思う。 データに重要度をつけて、重要度が低いデータを奥に押しやったり、 そもそも記憶の対象から外したりするんだから。
住人の中に質問のある初心者さんはいらっしゃいませんかー?
>>526 はい
Rubyをコンソールで動かす時にコマンドラインから入力を得るにはどうすればいいんでしょうか?
pascalでいう
write("x:");
readln(x);
みたいな感じで
gets?
args = ["", "", ""] args[0] = ARGV.shift args[1] = ARGV.shift args[2] = ARGV.shift
line = ARGF.gets
print "x: " x = gets
532 :
487 :2011/09/11(日) 15:49:17.37
>>488 ありがとうございます
とりあえずsequel使って進めてみます
Padrinoを使って、管理画面を生成し 「ip_address」という名前のモデルを作って、管理画面からレコードを1件新規作成したところ 管理画面の一覧表示で以下のようなエラーが発生するようになりました このエラーの解決方法をご存じの方はおられないでしょうか? Padrino::Routing::UnrecognizedException - route mapping for url(:ip_addresses_edit) could not be found!: d:/ruby/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.2/lib/padrino-core/application/routing.rb:395:in `rescue in url' d:/ruby/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.2/lib/padrino-core/application/routing.rb:370:in `url' d:/ruby/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.2/lib/padrino-core/application/routing.rb:723:in `url' D:/work/padrino-test/admin/views/ip_addresses/index.slim:26:in `block in evaluate_source' (以下略) URLのルーティングに失敗して、エラーが出ているということは分かるのですが padrino、Sinatra、HTTPRouter、自分の設定のうちどれに問題があるのか 切り分けがうまくできない状態です
534 :
533 :2011/09/11(日) 16:30:38.42
なお、テンプレート内でエラーとなっている箇所では 以下のようにしてurlメソッドを呼び出しています (padrino側が自動生成したコードです) url(:ip_addresses, :edit, :id => ip_address.id) 環境は以下の通りです Windows XP ruby 1.9.2p0 (2010-08-18 revision 29036) [i386-mswin32] padrino 0.10.2
質問です。 class Sample def methodName1 処理 end end class Sample def methodName2 処理 end end こんな風に2回、同様のクラス名で別個のメソッドを定義して インスタンス化し、methodName1とmethodName2を実行したら 両方とも呼べたのですが、このように最初に定義しておいた クラスに対して、後で宣言を追加するのって、わりと よく使われるのでしょうか? なんとなく、宣言ははじめにまとめてやるべきな気がするのですが お仕事で使うようなプログラムでも、普通に上記のような クラスを再定義するような形で機能追加とかしたりしますか?
まとめてやるのが基本ではある。 だけどRailsみたいに組み込みクラスとかまでそうやってあれこれいじってる 例もある。
まとめるべき (どこかで)requireするたびに(どこかの)クラスのメソッドが書き変わるという運用も可能だが、おおむねバグの元だ
その場だけの自分用スクリプトを書くときに 既存のクラスにちょっと機能追加して使ってみたりする
539 :
uy :2011/09/11(日) 22:18:34.31
>>535 前のlambdaの質問者はセンスあったが
お前はセンスない
その場所に疑問点が浮かぶ時点で・・・まだ見えてないぜ
見えないレスが増えてきたと思ったら、また口だけのボクちゃんが戻ってきたのか うざいな
NGして見えねーようにして誇らしげにうぜえってレスしてる人のがうざいです
>>535 その挙動はopen classと呼ばれていて以下のような用途に使われている。
・バグへのパッチ当て(既存メソッドの再定義)
・(継承して使うようには設計されていない)ライブラリの挙動をカスタマイズ(既存メソッドの再定義)
・既存クラスの拡張 (メソッドの追加など。例:ActiveSupprt)
継承、委譲では難しいことが可能。
元のコードには手を入れなくて良いというのがみそ。
>>528-531 ありがとうございます。
なるほどー色々やり方があるんですね
試してみようと思います
おなじ処理の繰り返しだけど 初回や最後だけ追加処理があるとかのばあい どうするのがいいのでしょう 初回? = true 10.times do #繰り返す処理1 if 初回? #初回だけの処理 初回? = false end #繰り返す処理2 end のようにしているのですが
ああ、あると便利と言われつつもぜんぜん実装されないんだよね
最初の要素または最後の要素だけ特別処理する書き方って
>>547 でおk
each でブン回す場合は
special_action(data[0])
data[1..-1].each do |x|
normal_action(x)
end
みたいに書くことが多い
どっちにしても、若干キモい
549 :
uy :2011/09/12(月) 23:07:19.51
>>547 instance_exec 0..3 do | a |
a.each do | x |
p x
p :first if x == a.first
p :last if x == a.last
end
end
>>547 10.times {|i| ... } 形式を使ってi == 0とi==9のときに追加処理
>>549 配列の中身が全て違う値の時にしか動かないような(そういう前提なのかもしれんけど)。
>>550 each_with_indexも使えそう。
個人的には
>>548 のように、特別な処理をする部分としない部分を分けた上でループさせるのがすきだな。
eachとかtimesなどは毎ループチェックが気にならないなら手軽そう。
これよく悩むわ
何万回と処理されるループの中に初回とか最後とかの一回しかtrueにならない判定入れたくないんだよな
かといって
>>548 みたいにするのもキモいし
whileを常用してるから、こんなんで悩まねーな
554 :
uy :2011/09/13(火) 02:39:15.39
これはプログラミングの暗部に触れてる。どうやっても綺麗にかけない類のアルゴリズム。
初回処理 while文 最終処理 でいいんじゃねぇの?
whileだといつもそんな感じになるから悩みようがないな
>>556-557 そうじゃなくて、
while
何か処理
初回処理 if 初回
最終処理 if 最後
何か処理
end
だから悩んでるんじゃないの?
ない。素直にifっとけで終わる話を長々と…
速くしたいなら、最初と最後をループ外に出せばいい。 速度気にしないで、まとめときたいならループ内に置いておけばいい。 ただそれだけだろう。
初回だけ変えるのは簡単だと思うけど、最後ってどうすれば良いんだろう。 Array みたいに最後がどれかわかるものはともかく、 Enumerable なオブジェクト一般だと。
>>559 判定が面倒だという話だろ
繰り返しの初回と最後の真偽を返すプロパティがある言語もあるし(たとえばPHP)、
繰り返しの初回や最後に特別に実行されるルーチンを記述できる言語もある(見た時は凄い便利だと思ったんだが、言語名を思い出せない)
そういうのがRubyにないかという話だと思われる
で、まあ、無いw
一般的には
>>549 のように配列削る
each_with_indexでインデックスつきで処理してインデックスが0かlengthであるかどうかで分岐させたりもする
俺ならprivateメソッドかprocの出番かな 共通処理を括り出して、初回限定処理や最終回限定処理はループの外へ
generatorでループ回すときはどうするのが良いんだろ?
新しい配列を生成しちゃうなんて最悪ぅ
配列のsliceはコスト低いんじゃなかったっけ
今の実装だと中身はコピーオンライトで共有してるんだっけ?
元の配列のx番目からy番目までを参照してくださいという情報が入った特別な配列のフリをする物体を返すんだったはず array.cのary_make_shared()を読むとええ
ちょっと話ずれるけど、文字列のsliceもそうなってたりするの?
>>570 そう。sliceはpythonの用語だけど。
つうか、配列もそうだったとは知らなかった。勉強になりました。
>>571 Ruby にも String#slice あるよん。
sliceしてreplaceするとどうなるのっと
コピーオンライト
コピーオンライトってコピー元が変更される時も働くのか そりゃそうだよな
576 :
uy :2011/09/15(木) 02:27:13.72
納得してんじゃねえよ Rubyのそういうのを全部細かく設定できるようにさせるべきじゃね こうするのとこうするのはどちらがよいか?って側面でRubyは片方を選んできてる あくまでそれはデフォルト設定として、 設定変更すればもう片方の道を選べるようにしていくと、使用ユーザー層が広がる
トリップつけろバカ
全部細かく設定とか、php.iniのウザさを知らないんだろう 言語設計者としてのセンスはゼロのようだな
581 :
デフォルトの名無しさん :2011/09/15(木) 18:19:52.35
ruby -r kconv -n -e 'print Kconv.toeuc($1+"\t"+$2+"\n") if /\((.*?)\) (.*)/ =~ $_;' *.txt > test.log これをワンライナでない形式にしてください。お願いします。
582 :
581 :2011/09/15(木) 19:05:49.43
require 'kconv' ARGV.each do |filename| file = open(filename) while line = file.gets do print Kconv.toeuc($1+"\t"+$2+"\n") if /\((.*?)\) (.*)/ =~ line; end file.close end 書いてみました。これであってますか?
require 'kconv' while gets print Kconv.toeuc($1+"\t"+$2+"\n") if /\((.*?)\) (.*)/ =~ $_ end
584 :
581 :2011/09/15(木) 19:31:30.38
585 :
uy :2011/09/16(金) 03:00:48.45
>>579 ハァ?
お前がRuby開発陣でないことを祈るよ
けどRubyはインクリメント、スタティック変数、デストラクタすら実装しない言語だからな
それを「センスある」と、勘違いしてるならマジでもうダメだな
確かにスタティック変数、デストラクタが必要なソースコードは式が甘いんだけど
そいつらをなくすんだったら、別の解決策を提示しておかないと、必要な装備がないただのマゾゲーになるわけだ
586 :
uy :2011/09/16(金) 03:06:05.69
特にスタティック変数に関してはそこかしこで、意味不明なコード量産されている いつになったらスタティック変数か、その代わりになるものが実装されるんだ? 言っちゃ悪いけどスタティック変数はバグの元であると同時に、プログラミングしていく上で必要な概念なんだ ようは、スタティック変数は、メソッド内やクラス内に内包されていたとしても 手動GCによって初期化が可能な機構を作って初めてバグではなくなる Cでいえば、スタティック変数はすべてアドレスを保存しておく感じ それさえやっていないスタティック変数は、もうバグの1種として扱って良いレベル。 なくすことは正解であるが、別回答を用意していないから、素人が初心者が素のスタティック変数を使う以上に ゴミカスなコードを書く事態に走っている
>>585 > Rubyのそういうのを全部細かく設定できるようにさせるべきじゃね
↓
> 全部細かく設定とか、php.iniのウザさを知らないんだろう
何がスタティック変数だ。話そらすなよクズがw
まずは挙動を細かく設定で制御できるという、
お前のクソアイディアについて議論しろ。
ここでuyに反応するなぼけ
589 :
uy :2011/09/17(土) 00:56:04.90
>>587 お前その程度で話しかけてきたの?
話をそらす → ×
話についてこれない → ○
100回レスよんで理解してからもう一度話しかけろよゴミ
本当にちょっと、高次元の話になるとすぐ話ズレたとか何とか言って、
耳から聴いた言葉が反対側の耳からとおりぬけてるように見えるよ
これだからマジレスする価値がこの板にはないんだ
自分の理解出来ない事 やった事のないこと
それを言ってる初心者は、本当に初心者? よく考えてからレスしろゴミ
初心者スレッドでよくわからない高度なお話はやめていただけませんか
統合失調症だから
uyってつまらないな Perl忍者のほうが1000倍おもしろいけど
[ぁ-ん] ひらがなだけ [ァ-ヴ] カタカナだけ [一-龠] UTF-8の漢字だけ [亜-煕] sjisの漢字だけ sjisの2バイト文字にだけマッチっていうのはないんですか?
それただの正規表現だぞ 正規表現がなにかわからないなら勉強してくれ
> [一-龠] > UTF-8の漢字だけ > [亜-煕] > sjisの漢字だけ 正確にはそれぞれ、 「UTF-8の時に、漢字にマッチ」 「sjisの時に、漢字にマッチ」 だ。 「UTF-8の漢字にマッチ」などというパターンはないし、BMP外の字にもマッチしない。 基本をどこかで勉強しろ。
とはいえ、どっかのライブラリに代表的な正規表現として入ってねーかなと思うことはある 日本中で100時間くらい節約になると思う
>>596 > 「UTF-8の漢字にマッチ」などというパターンはないし、
↓これはダメかな?
str.scan(/\p{Han}/)
>>597 やりたいことは、
・まずStringをdupしてASCII-8BITにforce_encoding
・そいつに対して、あきらかにUTF-8ですあり(ry を判定するASCII-8BITなRegexpでmatch
・判定結果を返す
ということ?
600 :
デフォルトの名無しさん :2011/09/18(日) 19:20:25.67
ひらがな、かたかなだけならpがいいんだけどねー
>>598 "〆"にはマッチしない事に注意が必要だね
603 :
デフォルトの名無しさん :2011/09/18(日) 21:51:04.59
今から学習しようとしてる素人ですが 1.9がオススメですか?
>>602 漢字でよい
漢の国由来の文字という意味では違うが、国字として認定されてるので、現在ではきちんと漢字
>>603 現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.2 の2系統が存在
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。両対応させるには相応の追加記述が必要
1.9.2 用の教科書があるなら 1.9.2 から始めても構わないが、1.8 用のスクリプトやライブラリは 1.9.2 では動作しないので注意
1.8にします
Railsでさえ、次のバージョンでは1.8を捨てると言ってるのに・・・
1.9なのでしょうか?
プログラム言語にあるまじき優柔不断さ
道に迷って交番行ったら 優柔不断といわれても。 初心者スレではないのですか?
特徴教えてそこからどうするかはお前次第だろ 甘えんな
>>610 ここ交番じゃないです
そこら辺のドライバーに道を尋ねたようなもん
これから始めるんなら1.9
614 :
uy :2011/09/19(月) 07:25:25.38
1.8も1.9もゴミだからやらなくていい Ruby2.0がでるまで待機してろ やることないから俺もそうしてる
>>613 まあ、どっちも必要になるだろうというのが正直なとこだが
初心者が慣れる頃には1.9だらけになってたらいいなーという希望込み
1.8のマニュアルやガイド、書籍。Tips、テクニックは基本的に軒並み無効なので、対象バージョンの見極めだけは注意
古いサイトや古い本の記述を1.9でそのまま書いても動かないか、中途半端に途中まで動いて"不可思議"なエラーで止まるぞ
買ってきた本、借りてきた本、ぐぐったサイトの記述が1.8専用だったとしても責任は持てん
1.8.7やってから1.9.2やれというのは 「これは1.8.7では動きませんエラー」はたいていメソッド不足でわりとわかりやすいのに対して 「これは1.9.2では動きませんエラー」はそもそも判別めんどくさいというのもあるかと思う つきっきりでガイドするなら1.9.2がおそらくいちばん楽なのは間違いない 2番目以降の言語としてRubyをやる場合も、たぶん1.9.2でいいかと思う (こんな人はどれがいいかなんて聞かないだろうから(聞かないよね??)、無視していいはず) 独学でなおかつプログラミング初心者となると話が面倒に
そもそも初心者がrubyに手を出すなと
なんかこの展開一億回ぐらい見た
>>619 1.8.7が無くなるか、1.8シリーズにも外部知識にも依存しないガイドが無料で出るまで続くかと思う
無難な方針はC89・C++・C99・C++0xの互換性問題と同じく、 基礎部分として1.8/1.9で互換の部分を教えることだと思う ただ文字列・IOの仕様が厄介だが……
>>620 1.9特有の質問があったらWikiにまとめとくぐらいのことはしてもいいかもね
言いたくないけど、実質上の問題はエンコーディングのとこだけで、しかもそこが致命的 避けて通ることもごまかすこともできやしねえし、望んだ動作にならないのはたいていRubyのせいじゃないのがなんとも 「それは元ファイル作成者が悪いんです!!」「間違ってるのは世の中のほうなんです!!」「でも対処は自分で!!」 と言い続けるのはけっこうしんどい
もちつけ
>「それは元ファイル作成者が悪いんです!!」「間違ってるのは世の中のほうなんです!!」「でも対処は自分で!!」 WindowsのRuby1.9でサイトのHTMLを取得したんですが、で始まる質問は頭が痛い
個人的には1.8から1.9への移行で一番苦労したのはDLだな。 ライブラリ名は同じなのに全く互換性がないから。 まあ初心者はDLなんか使わないかもしれないけど。
あれはdl2とか名前変えた方がよかった
1.9が2.0に向けての開発版だったから許された変更が、方針変わってもそのままにされた不幸ですな
1.9.2に移行したときは、文字列の[]が数値ではなく、文字列を返すようになっていたのにハマった バイナリと文字列が同じ型なのにStringを拡張されたのがつらい
ありがたいことに漏れには気にならない
おれはむしろうれしかった
位置の定義自体も変わってるから、まったく別ものだし
急にインクルードパスから'./'が除かれるとかな
1.8使えばいいじゃん
>>633 それはスクリプト処理系全般でみんなやってることだから
どうして外されたんだろう? 便利だったと思うんだけど
いや便利じゃないって どう考えても誤爆のほうが多い 自力でカレントディレクトリのファイル require するなら require './hoge.rb' って書いてね
>>637 ,638
!!
理解したつもりになれた
ありがとう
WindowsでちょこっとしたGUIアプリ作るのには向かない? C#勉強すべき?
使ったことなくて書くけど、最近リリースされたGreen Shoesとか試してみれば? ぱっと見簡単そう
>>640 デファクトスタンダードのGUIライブラリ無いから、情報量の多さからとGUIデザイナ標準搭載な環境からC#になるかな
何かGUIライブラリを既に知ってるならRubyでも良いと思うけど
>>640 C#使え
いや、別にC#でなくてもいいけど、とりあえずRuby以外でやっとけ
Rubyである部分が何もないから
C#はいい言語
>>643 > Rubyである部分が何もないから
どういう意味?
シンタックスシュガーとか動的型付けとかないよ それがスタンダードなんだけど
C#はシンタックスシュガーがわりといくつもあった気がしたが。 4.0ではdynamicキーワードによる動的型付けもサポートされたよ。
以後構文糖とは何かで議論が続き散々もめたあと コンパイラスレから遊びにきた通りすがりが一蹴する流れが 来ません
>>640 Ruby + Windows + GUI は最悪の組み合わせ
>>645 >>643 じゃないけど
Ruby が必要である部分が何もないから
Ruby で GUI するメリットって何もないから
っていう意味だと思う
全部RubyのオブジェクトっぽいRubyっぽい引数データのように振舞ってくれていればいいけどな 実際はそうじゃないし 結局はGUIの部分だけ別言語で書くことと同じ
>>486 をテンプレに入れようという流れもあるからな
getsでささるとか1.8時代の話なんだが
>>651 ラッパーとか作ってる人がものすごーく頑張ってくれているとどうにでもなるんだけどね
さすがにそんな人はいないし、「○○で書くところの××を」みたいな指示になる
じゃあ最初から○○で書いたほうがいい
657 :
uy :2011/09/20(火) 16:06:54.23
>>615 ハァ?
球技での鉄則は「ボールに当てれば何が起こるかわからない」だ。
野球に然り、テニスに然り、
ボールに触れさえすれば勝てる可能性はそこにある
例えそれが限りなく0に近かろうとな 四角いものと違って、人は丸いものにかかる力を計算しきれない
質問なのですが、 こんなふうに for i in 1...10 puts i end とRubyで記述した場合、普通は1から10が順番に表示されますよね? うちのRubyでは1から9までしか表示されません。 0...10とすれば、0から9。1...100とすれば、1から99といった具合です。 irbでもrubyでも同じ事が起こります。 これはインストールが上手くいっていないのでしょうか。それとも何か設定がうまくいってないのでしょうか。 Ruby1.9.2をWin732bitで使用しています。 宜しくお願いします。
>>659 なんと、そんなことだったとは・・・
これのせいで1時間以上も時間を無駄にしてしまった・・・
本当に助かりました。ありがとうございました。
>>660 初心者にはよくあることだ
0とOを間違えるとか
1とlとIと|を間違えるとか
'と`を間違えるとか
qとgを間違えるとか
だからこれにめげずに頑張れ
663 :
デフォルトの名無しさん :2011/09/20(火) 23:38:40.17
ていうかそもそもforなんて使わないので本気でどうでもいい 1.upto(10) do |x| puts x end
もっと使わん
今回の質問に関してはドットの個数が重要でfor使わないとかは瑣末な話
いや、Rangeオブジェクトをリテラルで書く方法なんて知らなくてもしばらく生きていける forを使うことはまず無いし、forを使わなければRangeのリテラル記法に悩むこともひとまず無い
他の言語でかかれたプログラムからRubyのスクリプトを作成するとき まずforを意識する
>>667 「今回の質問に関しては」ってわざわざ書いたのにびっくりだわ
forを使わなくても普通にRangeリテラルは使うぞよ (1..10).each{|i| puts i}
俺も1.upto(10)よりは(1..10).eachとしてしまうなあ 無駄オブジェクトなんて気にしない
forはブロックを生成しない
日本語が通じない・・・
日本語はブロックを生成しない
Rubyは海外でも結構ユーザがいるから 日本語が堪能じゃない人が来てるんだろう
正数の配列を与えると3つ以上の連番を圧縮して文字列として返してくれる関数を書いてくれ compaction([1, 2, 3, 10, 11, 20]) => "1-3, 10, 11, 20"
golfにその問題なかった?
どこのゴルフ場での出題?回答公開されてるならそっちを参考にするけどできれば読めるコードがいい
682 :
681 :2011/09/21(水) 04:05:10.77
あ、引数変更してた。これはだめだ
>>681 すげえよこんなん思いつかねえ
普通に配列のインデックス+1とかして見ていって == で比較して連番かどうかチェックしようとしてたわ
def compaction(a) a = a.sort ; buf = [a.shift] ; ans = [] a << nil a.each do |n| ( buf << n ; next ) if buf[-1].succ == n ans << ( buf.size == 1 ? buf[0].to_s : '%d-%d'%[buf[0],buf[-1]] ) buf = [n] end ans.join(', ') end
訂正
>>684 × ans << ( buf.size == 1 ? buf[0].to_s : '%d-%d'%[buf[0],buf[-1]] )
○ ans << ( 3 <= buf.size ? '%d-%d'%[buf[0],buf[-1]] : buf.join(', ') )
>>663 Perlは猫ちゃん演算子だからそんな間違いは起きないよ
688 :
デフォルトの名無しさん :2011/09/21(水) 09:14:10.11
>>687 いやいや、.. と ... の区別を導入したのはPerlだろ、という話なんだが。
neko operatorはPerl6だね
Perlに ... なんてあったかな?と調べたら print "equal" if ( 1..3 ) == ( 1...3 ); # equal 範囲としては同じだけど フリップフロップとして動作するときに 左側の式が真になったとき、すぐには右側の式を評価せずに真を返し 次回から右側の式を評価するってものだった で、Rubyでも同じ動作をするのであった 知らんことあるなぁ フリップフロップとして..を使ったことなんてないのだけど
Perlではフリップフロップとしてしか動作しないのに、それを範囲にも適用した創始者のセンスのなさを嘆いているのですね
でも .. と ... が(特に初心者には)間違えられやすいことは Perlの頃だってわかったんじゃないのかな。 なのに同じ問題をRubyにも持ち込むってのはどうなんだろう? Perlに似てさえいればよかったの?
Signal モジュールでその環境でサポートしている シグナル (シンボルでも番号の数値でも可) の一覧を得る方法ってありますか? シグナル番号の最大値 (NSIG?) でもかまいません。
>>690 >print "equal" if ( 1..3 ) == ( 1...3 ); # equal
これ↑って、多分スカラーコンテキストで評価されてるから
( 1..3 ) ⇒ $.との比較で偽と判定されて0
( 1...3 ) ⇒ $.との比較で偽と判定されて0
偽同士なのでif文の条件が成立。
以下のようにリストコンテキストで評価すれば意図した範囲演算子として動作するはず。
print "equal" if [ 0..3 ] ~~ [ 0...3 ];
Signal.list …じゃ足りないんだろうな
>>697 すみません、私の目が節穴でした。
それで十分でございます。ありがとうございました。
これでリストアップされない signal もあるかもしれませんが、
ひとまずこれでいきたいと思います。
すみません。質問よろしいでしょうか。 some_method(1, 2, 3) を args = '2, 3' some_method(1, eval(args)) みたいに実行したいのですが、何か方法はあるでしょうか。 evalでなくてもいいのですが、 一つの文字列から動的に複数の引数を渡したいです。
ものすごく一般論としては、そういうときは配列にして、引数部分で*による展開を行なう irb> def foo(x,y,z); puts x+y+z; end irb> a = [2, 3] irb> foo(1, *a) 6 どーしても文字列由来にしたいときは、文字列から配列をなんとかして作って、それで*展開をすればいい irb> def foo(x,y,z); puts x+y+z; end irb> s = "2, 3" irb> a = s.split(/,/).map{|e| e.to_i} irb> foo(1, *a) 6
親クラスと子クラスで、同名のインスタンス変数を別々に持ちたいと考えています。 よく使う変数名なので、親クラスの利用者(子クラスの実装者)に、 命名の変更を余儀なくさせたくないからです。 下記で、B#b_de_changeのとき、A#@aを変更せずに、B#@aだけを変更したいです。 どうすれば宜しいでしょうか? class A def a_out puts @a end end class B < A def b_de_change @a = 'b_de_change' end def b_out puts @a end end b = B.new b.b_de_change b.a_out # => b_de_change b.b_out # => b_de_change
>>700 どちらにしても最終的に配列にする必要があるんですね。
args = 'other_method(4, 5, 6), 7'
some_method(1, eval(args))
みたいに自由にやりたかったのですが、やり方を見直してみます。
ありがとうございました。
>>701 >親クラスと子クラスで、同名のインスタンス変数を別々に持ちたいと考えています。
クラスインスタンス変数じゃ駄目か?
>>702 逆に全体を文字列化してevalすればよいのでは?
eval("some_method(1, #{args}")
>>704 ありがとうございます!
あとでそれを思いついたのですが、
あまり自由度を高めすぎない方向でいくことにしました。
evalに頼りすぎず、きれいに書けるようがんばります。
706 :
701 :2011/09/21(水) 18:23:54.26
だから、クラスインスタンス単位でインスタンス変数を持てれば要望そのまんまだし、しかもそれはできるぞ、という話なのだろ まあ、通常のインスタンス変数で用が済むなら、 こんなにクラスインスタンス変数がドヤ顔で紹介されるようなこともなかったんだろうけど…
708 :
701 :2011/09/21(水) 20:00:46.41
>>701 -
何でクラスインスタンス変数が出てくるのかさっぱりわからんが
違う値を保持しておかなければならないなら変数は別にすべきだろう
class A
def a_out ; puts @a ; end
end
class B < A
def b_de_change ; @b = 'b_de_change' ; end
def b_out ; puts @b || @a ; end
end
>>677 遅ればせながら書いてみた
module Enumerable
def compaction(least = 3)
inject([[]]) do |(result, prev), i|
if prev == i
result.last << i
else
result << [i]
end
[result, i.succ]
end[0].map! {|i| i.size < least ? i : "#{i[0]}-#{i[-1]}"}.join(", ")
end
end
もう一つ。slice_before使ってるので1.9.2以降。 module Enumerable def compaction(least = 3) prev = nil slice_before do |i| (i != prev).tap {prev = i.succ} end.map do |i| i.size < least ? i : "#{i[0]}-#{i[-1]}" end.join(", ") end end p [1,2,3,4,5,10,11,20,200,201,202].compaction(2) p ["a", "b", "c", "e", "f", "k", "l", "m"].compaction
injectは相変わらず変態だなw それでも出来ちゃうのが汎用性の高さを物語ってるが…
result, prev = [[]]とかしれっと書いてるところが嫉ましい
1..10 1...10 連番を生成するときに使うこれについて調べたいんですが 名称がわからないので教えてください
範囲演算子 それによってRangeクラスのオブジェクトが作られる
>> (1..10).class => Range
>>719 仕様としては良いが、マナーとしては悪いかな
あんまり良い印象はない
ハッシュの特定のキーに配列で値を追加したい場合、 配列があれば追加、配列がなければ配列を生成して追加という操作を 一括して書くことはできませんか? result = {} add_item = "hoge" 10.times do if result["piyo"] == nil result["piyo"] = [add_item] else result["piyo"].push(add_item) end end p result PHPだとこう書ける部分です。 $add_item = "hoge"; for ($i = 0; $i < 10; $i++) { $result["piyo"][] = $add_item; }
(result["piyo"] ||= []).push(add_item)
h = Hash.new{|h, k| h[k] = []} [['k1', 'v1'], ['k2', 'v2']].each do |k,v| h[k] << v end p h #=> {"k1"=>["v1"], "k2"=>["v2"]}
result = Hash.new{|h, k| h[k] = []} result["piyo"].push(item)
726 :
uy :2011/09/22(木) 13:11:31.11
>>719 俺はよくやる
けどMatz()の気分によってエラーにされたりする範囲に見えるから
使い捨てコードじゃなく長く使うようなものだったら使わないほうが良い
自作のある程度汎用的なライブラリの中に埋め込むデバッグ表示のコードってどう書くのがいいんでしょう。 今は def add(a, b) $stderr.puts "add(#{a},#{b})" if $LIBDEBUG a+b end でやってるんですが。
気を遣いたい場合はLoggerを使う attr_accessor :log def add @log.info "add(#{a},#{b})" if @log end end require 'logger' c = C.new c.log = Logger.new($stderr) c.add(1,2) require 'logger' を書く位置がどこだと好ましいのかについては諸説ある
e-
>>723 がちょろっと1行だけで書いてあったらとりあえず一発殴るぞ俺
まあ、どれもそんなにわかりやすくはないな ただ、ブロックつき Hash.new と ||= の場合、後者のほうが動作の知名度はある気はする ブロックつき Hash はそのままだと dump できないし
734 :
uy :2011/09/22(木) 19:03:56.00
735 :
デフォルトの名無しさん :2011/09/23(金) 07:50:49.48
大きなサイズのファイルをダウンロードしてローカルファイルに保存するために Net::HTTPResponse#read_bodyを使おうと、ネットで利用例を探して 見よう見まねでやっていますが使い方がよくわかりません open("hoge","w"){|f| res.read_body(){|s| f.write(s)}} ↑のようにすると read_body called twice というエラーになります 他にres.read_bodyやres.bodyを呼んでるところはないのです res[content-length]などのヘッダの参照はしています
わかりにくくなりがちなので、1行で書こうとしないほうが… read_body はレスポンスボディを単に String で返す res = Net::HTTP.start('www.2ch.net',80){|http| http.get('/') } body = res.read_body File.open('output', 'wb'){|f| f.write(body) }
737 :
デフォルトの名無しさん :2011/09/23(金) 08:52:53.70
大きなサイズのファイルをダウンロードするためには res.bodyではなくres.read_body{block}を使ってblockの中で 少しずつ読みこめばいいと思ってるのですが そのような方法は無いということですか?
あ、get や post 使ってるな こいつは内部で既に read_body を使って文字列を作ってるので、逐次取得を自力でやりたい場合は request_get とかを使ってくれ
>>723 >(result["piyo"] ||= []).push(add_item)
個人的に、push より << おすすめ。
(result["piyo"] ||= []) << add_item
>>731 これはRuby(に限らずスクリプト言語)では普通に使われる。
このコードを見て相手を殴るなら、お前野存在はすごい大迷惑だから、Rubyに近寄るな。
740 :
uy :2011/09/24(土) 05:31:17.03
>>739 愁の虚空に舞いあがりしコードにいと賛同して然り
pushより<<がおすすめな理由は? どちらでも同じなら、より多くの人が理解しやすいコードを書くべきだと思うが
(result["piyo"] ||= []) を是とする人間にそんなポリシーあるわけないだろ
JavaScriptに慣れてると
>>723 が一番わかりやすいと思うんだが、
否定する人はどういう観点なんだろう?
もともと一括して書きたいって要望に対する回答なんだから読みやすさは捨ててるんだよな それとも一括して書きたいけどトリッキーな書き方は望んでないのか 俺は<<とpushだったらpush派だな
746 :
uy :2011/09/24(土) 11:54:33.48
上級者のかくコード re = {} re.default = [] re["piyo"] << "add_item"
わかりやすいかどうかで言えば圧倒的にわかりにくいが、短いかどうかで言えば圧倒的に短い Hashに ||= でチェックつき代入をしてなおかつカッコで包んで戻り値をメソッドチェーンで利用するなんてカッコ悪いにもほどがあるが、 しかしその場の1行で機能を全部説明し切ってはいるw どうせ外部に出すコードではないのだろうし、好きにせえとは思う
>>746 % irb
irb(main):001:0> re = {}
{}
irb(main):002:0> re.default = []
[]
irb(main):003:0> re["piyo"] << "add_item"
["add_item"]
irb(main):004:0> re["hoge"] << "add_item"
["add_item", "add_item"]
アホ。
そういう動作をするHashが作れるから使ってね、というのが、いちおうRubyとしての回答なんじゃなかろうか メッセージをとりあえず受け入れてオブジェクト側で頑張る、というのがRubyっぽい気は、ちょっとする(ちょっとだけだけど)
750 :
デフォルトの名無しさん :2011/09/24(土) 13:50:57.93
ブロック付きHash.new相当はdefault_procでございます。 h = {} h.default_proc = ->(h,k) { h[k] = [] } h[1] << 10 h[2] << 20 h # => {1=>[10], 2=>[20]}
人の言う「より多くの人」の前には「一定の水準を満たした」が隠れてる 初心者にとって理解しやすいコードしか書かずにいたら初心者脱却出来んぞ
752 :
uy :2011/09/24(土) 14:06:39.77
>>748 なんだこれ
この動作は知らなかったけど、この仕様だとhash.default使い道ないじゃん
だからHash.newにブロック渡せというのだろ
> 配列があれば追加、配列がなければ配列を生成して追加
をRubyにおいていちばん端的に表現するのは
>>724-725 の
Hash.new{|h, k| h[k] = []} した Hash に普通に追加
だ
そのままだとdumpできないというめんどくさい制限があるが、dumpするようなデータとして残ることなんて稀だし、
>>750 のようにHash#default_proc=にnil指定すればいい
>>753 「自分の知ってる言語」に無い機能だから避けるんじゃないかという気がちょっとする
なぜか頑に for を使う人が最近いるっぽいのと併せて、そんな感じがする
>>741 なんで << より push のほうが、「より多くの人が理解しやすいコード」なんだよww
Rubyの << を知らないだけじゃん。勉強しなおせwww
破壊的に変更しない(できない)オブジェクトなら h = {} h.default = 1 h[:hoge] += 1 h[:fuga] += 10 p h # => {:hoge=>2, :fuga=>11}
>>752 知らないとかいう問題じゃなくてRubyがまるでわかってないからそうなる。
「上級者のかくコード」とか笑わせんな。
Ruby の << の優遇っぷりは異常 通常は適切な英単語メソッドのほうがわかりやすいとみなされるんだけど、<< に限っては例外だな
C++と同じ誤謬に陥っているよね
>>744 手続き型べったり vs. 関数型の経験がある人という図式だろう
前者にとってプログラムは文の並びで変数を書き換えていくもの
代入文の返り値を使うという発想には抵抗がある
後者にとってプログラムは式を組み合わせたもの
返り値はなるべく活用するので代入が値を返すなら捨てずに使う
>>723 の(result["piyo"] ||= [])はイディオムだね
それに<<しようがpushしようが代入が値を返すことを知っていれば大差ない
まとはずれだな
戻り値を使う(ためにカッコすらを使う)のが気持ち悪いという話だろう 誰も ||= の是非なんぞ論じてはおらん
驚き最小の法則を知らんのか
NameError: undefined variable or method '驚き最小の法則'
>>759 もともとは「C++の<<って便利なことが多くね?Rubyにももっといいのがあったら便利じゃね?」というノリだったのだと思う
まあ、便利であることは間違いない
ダックタイプなんかとの合わせ技で、オブジェクトがわからなくてもとりあえず << すればなんとなく追加されるという機能に
>>762 >代入文の返り値を使うという発想には抵抗がある
って書いてあるじゃない
shift unshift pop ときて push だけ << 使う奴の美的センスを疑う
>>762 というか、比較対象が単なる Hash への追加だから問題外
なんでわざわざ処理を書き込まなければならないのか意味不明
処理をメソッドにして外に帚き出して見通しを良くする行為と全く同様に、私たちはブロックつきHash.newを使う
>>767 String#<<があるんだからArray#<<があってもいいだろ(以下同文)
そもそもpushはそれら3つと同様にスタック由来の用語だから、配列に追加するという行為を表現するにはイマイチ
スタックへのshift/unshiftは堺正章しか使えません
その1 result = {} add_item = "hoge" 10.times do if result["piyo"] == nil result["piyo"] = [add_item] else result["piyo"].push(add_item) end end その2 result = {} add_item = "hoge" 10.times do (result["piyo"] ||= []).push(add_item) end その3 result = Hash.new{|h, k| h[k] = []} add_item = "hoge" 10.times do result["piyo"] << item end 見通しがよくてわかりやすいと思うものを使え
Stringにあるからあってもいいだろって主張が苦しい上に 作るかどうかは松本の勝手だから許すにしてもそれを使うかどうかにセンスが問われる
array << e を作るなら array >> e; e << array; e >> array もできるようにしてくれ
>>771 下に行くほど「Rubyらしい」ように思う
775 :
uy :2011/09/24(土) 16:18:21.77
>>757 なんだコイツ
そのRubyをまったくわかっていないというのは、どっちの意味で言っているかでお前のレベルがわかるよ
俺はただmethodsから適当に拾ってきた.defaultをリファレンス読まずに使っただけなんだから
俺の意図しない動作をするRubyが悪いんじゃね?
(勝手に)その4 result = {} add_item = "hoge" 10.times.do result["piyo"] ||= [] result["piyo"] << add_item end
>>760 代入文(破壊的操作)の返り値を使う事こそ手続き型の発想じゃないかと思う。(C言語的?)
関数型言語(MLやHaskel)の経験があれば、「参照透明性の保存」を強く意識するはず。
>>723 の ||= は(nil から obj へ更新する)破壊的操作だから、参照透明性は保存されない。
関数型であれば、result = { "piyo" => ["hoge"] * 10 } の1行で済ませることを最初に考える。
>>778 なるほど。確かにCでは代入の返り値を使うね
>>723 を見て関数型っぽいとするのは無理があるか
>>760 の「返り値を無駄にしない」と
>>778 の「参照透明性の保存」の
どちらがより関数型の特徴として強いかと言われれば
関数型の関数は数学的な関数という含意があるから自分も後者を選ぶよ
result = { "piyo" => ["hoge"] * 10 }は怖いかな
result['piyo'][0][1] = 'a' とかありうる
よく使われるから hash.default_array! みたいなの実装しちゃえば
数値だけが入っている配列(長さ固定)で、ソート後0を後ろにしたいです [22,3,0,2,0,2,5] => [2,2,3,5,22,0,0] どういう操作をしたら実現できますか?
[ 22,3,0,2,0,2,5 ].sort { |a, b| if a == 0 || b == 0 1 else a <=> b end }
a=[22,3,0,2,0,2,5] b=a.sort b.push(b.shift) while b[0]==0 配列に追加するとき<<は死んでも使わんで
>>781 ary.sort{|a,b| a==0||b==0 ? (a==b ? 0 : (a==0 ? 1 : -1)) : a<=>b }
>>782 1に決めうちはいくない
ちょっと三項演算子使い過ぎて読みにくいので整理 ary.sort{|a,b| case when a == b then 0 when a == 0 then 1 when b == 0 then -1 else a <=> b end }
あまり良くはないけど、超えない値が分かるのだったら MAX = 9999 [22,3,0,2,0,2,5].sort_by{|i| i == 0 ? MAX : i} みたいにしてしまうとか
787 :
782 :2011/09/24(土) 20:19:42.22
>>784 なぜ1の決めうちいかんの? NGになるような具体的な入力データを提示しておくんなさいまし
>>787 [22,3,0,0,0,2,0,2,5]
仮にうまくいったとしても汚いコードに違いはない
789 :
782 :2011/09/24(土) 21:27:06.69
>>788 レスありがと。手元では [5, 0, 2, 2, 3, 22, 0, 0, 0] という実行結果を確認できた。
>>782 のコードはNGだ。うーん、なぜだろ。ソートのアルゴリズムと関係があるんだろか???
[22,3,0,2,0,2,5].sort.partition{|e| e != 0}.flatten(1) ソート後に、0じゃない要素と0を分離して、再び連結
791 :
782 :2011/09/24(土) 21:40:03.10
>>782 がNGな原因が分からんかったので、別の素直な方法にしてみた。
irb(main):001:0> zr, nz = [22,3,0,0,0,2,0,2,5].partition { |x| x == 0 }
=> [[0, 0, 0, 0], [22, 3, 2, 2, 5]]
irb(main):002:0> nz.sort + zr
=> [2, 2, 3, 5, 22, 0, 0, 0, 0]
#
>>790 のほうがスマートな気がする ... orz
>>782 がNGな原因
1と0を比較して1になり
0と1を比較しても1になる
これじゃソートできんだろ
irb> p [22,3,0,2,0,2,5].sort_by{|x| [x.zero? ? 1 : -1, x]} [2, 2, 3, 5, 22, 0, 0]
>>782-791 レスありがとうございます
その後自分で
@ary.sort!
@ary.delete(0)
10.times{|i| @ary[i] ||= 0}
なんて方法は見つけはしたんですが、
>>790 のpartitionをいただこうと思います
いちおう、
>>793 がいちばん妥当
sort のブロックの戻り値として配列 [x,y,z] があったら「xでソートしてからyでソートして最後にzでソートする」と
自動で読み下すように訓練されてるから(Array#<=> の動作は立ち止まって考えるには複雑過ぎる)、
伝わらないことを危惧する必要はない
ただし、ブロックの中は物凄い回数呼ばれるので、ブロック内を複雑にした場合、ソート完了までの速度の保障はしない
796 :
デフォルトの名無しさん :2011/09/24(土) 22:55:56.14
sort_by のブロックはSchwartzian transformation用なので、呼ばれる回数は 高々要素数に等しい回数まで。比較そのものが呼ばれる回数じゃないよ。
はやいのはどれでしょう(10点 複数選択可) def expensive_getsize(s); sleep 1; s.size; end ary = ['Oberon', 'Perl', 'Qt', 'Scala', 'Tcl'] # ソートそのいち p ary.sort{|a, b| expensive_getsize(a) <=> expensive_getsize(b) } # ソートそのに m = ary.map{|e| [e, expensive_getsize(e)] } p m.sort{|a, b| a[1] <=> b[1] }.map{|e| e[0] } # ソートそのさん p ary.sort_by{|e| expensive_getsize(e) }
>>795 少し誤解を招きそうな表現な気がする。
[x,y,z]は、xで比較した結果が0なら、yで比較して、その結果も0なら、zで比較する。
と言ったほうがいいかも。
799 :
uy :2011/09/25(日) 13:57:51.81
>>797 基本的に一番短いコードが一番速いんだよ
> def expensive_getsize(s); print '.'; s.size; end > ary = ['Oberon', 'Perl', 'Qt', 'Scala', 'Tcl'] > p ary.sort{|a, b| expensive_getsize(a) <=> expensive_getsize(b) } ..............["Qt", "Tcl", "Perl", "Scala", "Oberon"] > m = ary.map{|e| [e, expensive_getsize(e)] }; p m.sort{|a, b| a[1] <=> b[1] }.map{|e| e[0] } .....["Qt", "Tcl", "Perl", "Scala", "Oberon"] > p ary.sort_by{|e| expensive_getsize(e) } .....["Qt", "Tcl", "Perl", "Scala", "Oberon"] まあ一般的にはsort_by{}のほうが速いんだが、 このへんの「速い」ってのは要は一時計算にメモリ使いまくって速度と等価交換無定量してるってことで(うん、Rubyっぽいね)、 要素数や適用頻度などの関係で使用メモリがモリモリ増えるのが困るときはsortやsort{}を使うといいというお話
801 :
uy :2011/09/26(月) 17:07:09.28
10万3000冊の技術書の記憶の中にも、 どこかの本にそんなことは書かれていた おそらくそれはあらゆる場所で繰り返し言われてる事だろうと思う 復習でもしているのか? 初心者スレッドらしくて ○
Integer === 3 # => true 3 === Integer # => false どうして結果が違うのでしょうか?
>>802 まず、===演算子は、左側の式に対して「===」という名前の、引数が1つのメソッドを呼ぶ。
そこに右側の式が引数として渡されるだけ。
Integerはクラス、クラスの===は、右側の式が自分のクラスとis_a?関係かどうかを調べる。
3は数値、数値の===は==と同じで、数値として等しいかどうかを調べる。
クラスかモジュールの === メソッドは 引数.kind_of?(自分) を呼ぶ それ以外のオブジェクトでは、再定義されていなければ(たいてい再定義されてはいない)単に == メソッドを呼ぶ クラスかモジュールの === 以外は単に等しいかどうかだけを見るってことだな
>>804 いや、結構再定義されてると思うけど。 Range や Regexp の === も良く使われるし。
Ruby は JavaScript じゃないから。 === は、Ruby ではたとえば、 case n when 1 .. 3 # n は 1〜3 when 4 .. 6 # n は 4〜6 end みたいな風にするために case の中で呼んでる、というものなので。
なんでそんな質問するのかと思ったら、 JavaScript にも === があるのね。 Ruby で直接 === 使うことはまず無いね。
JavaScript のほうは、常に == ではなく === を使え、とか言われるほどのものだからな。
> Ruby で直接 === 使うことはまず無いね。 おいおい、普通に使うだろ
いや、ないよ
正規表現使わんのだろ
普通使うとかまず使わないとか無益すぎるやり取りだな
正規表現のなにに使うんだ…
正規表現の===なんか、正にcaseのための定義じゃないのか。別に使ってもいいけど =~ が普通だろう
815 :
デフォルトの名無しさん :2011/09/27(火) 20:29:20.72
暗黙裏にcaseで使われてはいるんだろうけど直接書くことはまずないな。 Proc#=== は面白い。
"a".succ # => "b" "#".succ # => "$" "@".succ #=> "A" "3".succ # => "4" "9".succ # => "10" "9".to_s.succ #=> "10" 工工エェ(´Д`)ェエ工工 ASCIIコードで次を得るにはどうしたらいいの?
"9".ord.succ.chrというのがとりあえず浮かんだ
Rubyって初心者が最初に覚える言語としてはどうですか?
そもそも String#succ はアスキーコードの次を返すというメソッドではない アルファベット同士まはた数字同士で「境界」があるとみなし、それを越した場合は「繰り上が」る irb> p "Z".succ "AA" rb> p "AZ".succ "BA" アスキーコードを出してからそれを整数としてsuccして対応文字列を計算するしかないかと思う irb1.8> p "Z"[0].succ.chr "[" irb1.9> p "Z".ord.succ.chr "["
1.8.7以上で "9".bytes.first.succ.chr #=> ":" 1.8.7以下 "9"[0].succ.chr #=> ":" 1.9以上だと "9".ord.succ.chr #=> ":"
"9".ord.succ.chr
>>819 そんなもん定義を見れば誰でも言えるし誰でもわかるわ
"#".succ # => "$"
"@".succ #=> "A"
としといてなんで
"9".succ # => "10"
なんだ
0-9a-zA-Z以外の場合は例外にしてくれた方がまだ自然だわ
>>822 定義見たならわかるだろ
アルファベットと数字は特別扱いされている
succ「するものがない」場合に、仕方なくアスキーコードの次を返してるんだよね 本来はアルファベット文字列や数値文字列をインクリメントするという効果 アルファベットや数値が含まれていない場合の動作はオマケ
落ち着け おまえが思ってるのとは用途が違うんだ むしろ英数字が無いのが特殊ケース
> 0-9a-zA-Z以外の場合は例外にしてくれた方がまだ自然だわ
827 :
デフォルトの名無しさん :2011/09/27(火) 21:49:00.03
文字列のsuccはもともとPerlのmagic increment相当だってことを知ってるヤツと知らないヤツで話がかみ合わないな。
珍しく Ruby と PHP で意見(?)が一致してる機能だというのに
829 :
uy :2011/09/28(水) 03:54:15.02
>>818 いいとおもうよ
ただしRubyは初心者言語ではなく
完成度が高い言語っていうだけで、初心者には優しくない部分は多いがRuby挫折するようなら何の言語やっても無駄
1 RubyからはじめてRubyだけをずっとやる → スクリプト言語がメイン言語になる時点でゴミにはならない
→ スクリプトはわりと何でも出来るので、一般人視点から見ると凄腕にみえる、ただ技術者から見た場合、Rubyしかできないんじゃ初心者扱い
けど、いまさらCなんてやってもしょうがない気がするので、Rubyしか出来ない奴でも、俺は軽蔑しないよ
そもそも例示が1文字な時点で、String#succを勘違いしてると思う 揃いも揃って説明が 「次」の文字列を返します とかいうドヤ顔である時点で、アスキーコード関係なさそうだと気付いて欲しい そもそも2文字以上の文字列のアスキーコードってなんだ irb> puts "あなたは102番目のお客様です!".succ あなたは103番目のお客様です!
"m9".succが"n0"返してsuckまで読んだ
832 :
uy :2011/09/28(水) 11:29:18.04
>>829 続き
2 Rubyからはじめて次にCをやる → Cの言語構文を覚えたってレベルじゃなくて、
「いざとなれば」Cで何でも作れるレベルにいたれば中級者、ただ別にその「いざ」という時っていうのは
世界が滅びてこの世にコンパイラやインタプリタが存在しなくなり、自分がCでかくしかないような時のことだ
そんな時は、多分来ないので、出来なくても一応は問題ないが、Cをやることであらゆる物の根幹部分を知っておくと
ゴミみたいなプログラマを一言で黙らせることが出来るようになる
833 :
uy :2011/09/28(水) 11:31:22.33
3 RubyをやったあとにLispやった後にすべての言語を行う → たいていの奴は上級者(最大でもレベル5)でとまるが、極まれにレベル6(天使の域)に到達する奴がいる ちなみにそのレベル6の上という領域も存在する 人が踏み入れるべきではない場所なので、高い確率で発狂、自我崩壊、またはたどり着いた瞬間に即死する さて、 貴様は俺のところまで上ってくる気はあるか?
Matzさんこっちです
835 :
Matz :2011/09/28(水) 11:34:41.39
フォッ!!呼んだかーい!
836 :
Matz :2011/09/28(水) 11:52:00.51
Rubyの宣伝ビジネスになる金儲けに使えそうなやついたら連れ来てくれ 中学生も使えたな 儲け儲け いい宣伝効果だ 世間は子供に釣られてしまう じゃあ次は、美人でも使おうかな、Yuguiちゃんはおばちゃんだし、美人モデルにRubyやらせちゃおう それじゃ僕ちんの力でコミッタにしちゃうか ウフフ! エーイ!!トリャッ!! うんそうしよう その次はゲーム業界人にRuby 次はハリウッドだな よーしおじちゃんがんばっちゃうぞー フンガッフンガッフンフンガッ!!! とりゃー!!
まずは島根から出ろよ
僕は科学サイドで
839 :
デフォルトの名無しさん :2011/09/28(水) 23:21:07.71
Rubyで組み込みシステムを作るような計画も聞いたことがあるんだけど、 明らかにC言語などの方がいいようなきがするんだけど、 そんなに無理してあちらこちらにRubyを使う必要はあるのかな?
Riteだっけ? LuaやSquirrel対抗なら飛びつく人かなりいそう というかなぜ初心者スレに
GCあると楽じゃん。
>>839 どうせ日本だけの話だろ
TRONよろしく潰されるのがオチ
まだTRONがどうとか言ってるヤツ居たのか 誰にアホな事吹き込まれたんだ?
事情通出現wどんな真実があるのか書いてもらおうかw
おまえらのどちらかが池田信夫信者のバカで、どちらかがアメリカ&孫正義陰謀論脳のバカウヨ だということはわかったからよそでやれ。
書いてるのお前ばっかりだな
847 :
uy :2011/09/29(木) 22:54:05.03
リク・ラク・ラ・ラック・ライラック 来たれ氷精 闇の精(ウエニアント・スピーリトウス・グラキアーレス・オブスクランテース) 闇を従え吹雪け常夜の氷雪(クム・オブスクラテイオーニ・フレツト・テンペスタース・ニウアーリス)
848 :
uy :2011/09/29(木) 23:07:19.57
ダークエヴァンジェル・・・・・・・ 闇の福音・・・・・・
24にもなって子供みたいなことを・・・
850 :
uy :2011/09/30(金) 01:07:09.45
光があれば、影が出来るってよく言うけど、 三角錐に真上から光を当てれば影なんてできねーんだよ それが世界のすべてを救う方法です
真上からなら円柱だろうと立方体だろうと同じだろ
質問です。 x=[[1,2,3],[4,5,6], [7,8,9]] という二次元配列がある場合に、各行の合計をそれぞれ求めて、その結果を新たに作る配列sumに格納して出力するにはどう記述すればいいんでしょうか。
Ruby宿題スレって落ちたのか もうアカデミックな場所では使われなくなってしまったのか
sum = x.map{|i|i.inject(0){|s,n|s+=n}} うむ、もっと簡単にする方法は・・・
Array#sumってないんだな 全要素+メソッド呼ぶとかであってもいいようなきがするが
>>857 超初心者なので、もっともっと簡単な記述でお願いします。
sum=Array.new(3)で配列作ってそこからがよくわかりません。
>>857 injectのブロックは式を返せばいいので代入(+=)は不要、加算(+)だけでいい
X: i.inject(0){ |s, n| s += n }
O: i.inject(0){ |s, n| s + n }
>>858 その汎用的な仕掛けがinjectメソッドではないのかと思われ
>>859 プログラミングの超初心者?
何か本とかWeb資料とかで一通り勉強したほうがいいよ
それからわからないことを聞けばいい
inject(:+)
初心者に inject とか教えても意味ないような。
def sum(args) ret = 0 args.each{|i| ret += i} ret end x=[[1,2,3],[4,5,6], [7,8,9]] y = [] x.each{|i| y << sum(i)} p y
>>859 これなら理解できるかな?
x = [[1,2,3], [4,5,6], [7,8,9]]
sum = []
for ary in x
e = 0
for i in ary
e += i
end
sum << e
end
p sum
これでもダメなら、(
>>861 の言うように)プログラミングの基礎から勉強したほうがいい。
そろそろ inject(:+) とかは、inject の本格的な使い方とは別に、 イディオムとして教えてしまっていいと思う。 18 の古いのを使ってない限り使えるし。
Pythonスレから来ました、まで読んだ
inject(:+)は、関数型では完全にイディオムとして成立してるね(injectじゃなくてfoldだったりするけど) 手続き型ではまだまだイディオムと呼ばれるには遠いが、injectやreduceがあるなら使えるはず
>>865 ありがとうございます。
こちらの方をベストアンサーとさせていただきます。
>>868 イディオムっていうか理論的な基板があるんじゃなかったっけ?
eachはメソッド名やサンプルからもなんとなくわかる mapもメソッド名やサンプルからなんとなくわかる可能性はある(そう高くはないが) しかしinjectを一発理解することはおそらく不可能 そもそも畳み込み関数自体がレアだし、 数式ではなく汎用データに対してのプログラムとして表現されるとこれは既に別物 inject(:+) と書いてあって「なるほどー」とか思えたならその人は嘘つきか、欧米の顔文字かなにかと勘違いしている
% irb rb> total = 0 => 0 rb> [1, 4, 7].each{|num| total += num } => [1, 4, 7] rb> total => 12 rb> [1, 4, 7].inject(0){|total, num| total += num } => 12 # 計算過程のイメージ 0 [1, 4, 7] 0 + 1 [4 ,7] 0 + 1 + 4 [7] 0 + 1 + 4 + 7 rb> [1, 4, 7].inject(:+) => 12
>>873 だから、injectに与えるブロックは(副作用の無い)式を返せばいいんだから、代入は不要だよ
X: [1, 4, 7].inject(0) { |total, num| total += num }
O: [1, 4, 7].inject(0) { |total, num| total + num }
チラ裏だけど、injectは数値の集計以外にも使える たとえば、以下はArrayからHashを作る処理 irb> alist = [[1,["a"]], [2,["b"]], [3,["c"]]] => [[1, ["a"]], [2, ["b"]], [3, ["c"]]] irb> alist.inject({}) { |h, (k,v)| h.merge({ k => v }) } => {1=>["a"], 2=>["b"], 3=>["c"]} これは以下と同じ irb> Hash[alist] => {1=>["a"], 2=>["b"], 3=>["c"]}
def sum1(x) x.inject(:+) end sum2 = -> x{x.inject(:+)} a=[1,4,7] p sum1(a) p sum2.(a) b=[sum2] p b[0].(a)
Dir::mkdir(path) Dir.mkdir(path) これって違いはないですよね?
>>879 同じように動くけど個人的には下を推す
理由は :: は階層の区切りで . はメソッド呼び出しと区別してるから
ときどき思う ASCII文字に矢印があったらプログラミング言語の構文はどうなっていただろうと
sora_hみてるとNARUTOの主人公に見えてくる そう思わないか? こいつを見るたびMatzのなにかを感じられる こいつを見るたびNARUTOに見えてしょうがない こいつは2代目ルビ影になるに違いない
低年齢化してるなぁ いったい何年生が書き込みしているんだろう
職場から書いてるに決まってるだろ。言わせんな恥ずかしい。
ASCII文字にλがあったら
質問よろしいですか? Rubyでテーブルジャンプをやりたいのですが書き方が分かりません …テーブルジャンプ? 関数テーブル? メソッドテーブル? 何と呼ぶのか分かりませんが、与えられた数値で処理を変える、みたいなことをしたいのですが… case atari_code when 0x00 by = 0 when 0x01,0x10,0x11 by = (63-x) (以下略) end 今は case when で書いてますが、case when は全部 if 文になると知り愕然としています。後のほうの記述値に到達するときは遅い=頻繁に呼ばれる部分では処理速度的にマズイのではないかと 入ってくる数値の範囲は決まっているので、配列データ内にメソッドを書いて呼んだら速くなるのでは、と思いましたが… ググったところ send なるものが使えるらしいと知りましたが、具体的な書き方が今一つよく分かりません…御教示のほどを… …テーブルジャンプにすれば、速度的にメリットはありますよね…? それともRubyは特別で効果が無いのでしょうか?
速度を気にするならRubyではない言語にしたほうがよい
関数テーブルの使い方とか利点とかを先に覚えてから Rubyで実現するとしたらここがわかりませんってのを質問したほうがいいと思う
パフォーマンスチューニングは測って特定してから考えろとうちのばっちゃが言ってた。
>>887 Rubyには「処理そのもの」や「処理と
データのセット」を
ひとつのデータとして扱う仕組みがある
前者はProcやブロック、後者はオブジェクトだ
与えられるのが数値でなくても良いのなら
そもそも処理(を含んだもの)をデータとして渡して貰うという方法がある
この場合、単にそれを呼ぶだけで良くなる
数値など処理と無関係なデータじゃないとダメならば、ifやcase-when以外では
ハッシュに各処理をぶち込んでおいて、添字でアクセスってのもあるにはあるが
よほど分岐が多くなるのでない限り条件分岐のが結果的に高速かつ楽な気がするなあ
試しにcase文を0..10000ぐらい書いてみたらメモリ喰いつくして止まった 一方lookuptab = {0 => lambda{...}, ..., 9999 => ...} lookuptab[9999].callは最後まで完走した 話がそれたけどRubyでcase/whenの代わりにルックアップテーブル使っても lambda生成のコストなんかもあいまってたぶん早くならないんじゃ でもこういうときにルックアップテーブル使うと高速化できるぜって例があれば見てみたい
自分なら特異メソッドとArrayでやるかなぁ。 > …テーブルジャンプにすれば、速度的にメリットはありますよね…? それともRubyは特別で効果が無いのでしょうか? まずは890の言う通り測りもしないで「速度的にメリットは」とか言い出す変な宗教から 抜け出すことだと思うけど。
まあ、実際にルックアップテーブル書いてみないと速度比較することもできないので 質問くらいはしょうがないとは思うが sendって自分でも使ったことないので試してみたが、こんな感じでいいのか class C1 def foo1(msg); p ("foo1 "+msg); end def foo2(msg); p ("foo2 "+msg); end end c = C1.new method_table = {1=>:foo1, 2=>:foo2} c.send(method_table[1], "additional parameter")
速度比較するんじゃないだろ 本当にそこがネックになってるかを調べてからってことだよ 全体の1%の部分を10倍高速化しても0.9%しか速くならない 全体の20%の部分を2倍高速化すると10%速くなる
896 :
uy :2011/10/02(日) 15:15:23.55
全体の1%の部分を10倍高速化しても0.9%しか速くならない(キリッ 全体の20%の部分を2倍高速化すると10%速くなる (キリッキリッ
898 :
デフォルトの名無しさん :2011/10/02(日) 17:15:57.23
例外をハンドルする関数を作りたい def HANDLE( func, arg ) try func( arg ) rescue Exception => e end end HANDLE( printfunc, 10 ) これRubyでできるの?
require 'logger' @log = Logger.new($stderr) def errlog begin yield rescue StandardError, Exception @log.warn $!.message raise end end errlog{ "str".undefined } W, [2011-10-02T18:30:51.416377 #2449] WARN -- : undefined method `undefined' for "str":String
>>898 まず、RubyにはC/C++でいう関数ポインタという概念が無い
かわりに手続きオブジェクト(Procクラス)があり、
それを生成する proc(あるいは lambda)という構文が用意されている
printfunc = proc { |arg| .... } # .... の部分にアプリ本体の定義を書く
def handle(func, arg) # メソッド名は必ず英小文字で始めなければならない
begin
func.call(arg)
rescue YourCustomError => e
.... # ここに例外eのハンドル処理を書く
end
end
handle(printfunc, 10) # 定義した処理を呼ぶ
901 :
デフォルトの名無しさん :2011/10/02(日) 18:39:48.05
def に直接 rescue が付けられることはあまり知られていないのかな。
>>901 筋がよくないことになることのほうが多い
小細工の域だと思う
def handle begin yield rescue Exception => e end end handle { printfunc(10) } こうか?
904 :
デフォルトの名無しさん :2011/10/02(日) 19:42:44.60
>>899 >>900 お前らスゲーわ。尊敬する。スゲー助かった!
ここまで完璧に解説したサイトは無い…みんな悩まないのか不思議。
とにかくありがとうございますm(_ _)m
rvm list known で出てくる *******-head ってやつは何ですか? すみません、低次元な質問で。
head=頭 開発の最新バージョン 通常、数字か番号をつけるんだけど それだとそれが今の最新バージョンかどうかわからないので はっきりわかるためにつけている。
rvmのマニュアルに説明が書いて…書いて…ない このへんを必要とする人は自分で開発やってるような人だからブン投げてあるな 固定のバージョン番号すらまだついてない状態の、 ついさっきちょっと変更してみましたなレベルの不安定な開発版の最新変更版 ふつうは使用してはいけない
>>906 , 907
どうも。
何となく想像はしていたんだけど、
確証が持てなくて。
個人のblogとかにはheadを入れる様な
サンプルも多かったので。
助かりました。ありがとうございます。
909 :
uy :2011/10/03(月) 15:37:31.84
require 'Win32API' a = Win32API.new("kernel32" , "CreateProcess" , "ipiiiiiipp" , "i") a.call( 0,"C:\\WINDOWS\\system32\\notepad.exe",0,0, 0, 0, 0,0, "sine","sinekasu") 質問ですがこれを実行すると、高確率で[BUG]になるんですけれど BUGなんですか? BUGってまさかあのバグですか? なんで放置するんですか? [BUG]って出ないときは"sinekasu"のあたりを適当に変えてください。あるいはnotepad.exeのところはちゃんと存在するexeにしてください 間違った引数を渡したら [BUG] Segmentation fault とか表示しないで引数が間違ってますとか だすべきじゃないですか??? ぼくは間違ったことをいっていますか? 雪は白いですか? もう秋ですdね
911 :
uy :2011/10/03(月) 15:51:28.16
a = ("a".."c").to_a b = nil a.map! do | m | unless $uu $uu = true b = a a.pop m = 99 a = ("x".."z").to_a end p a p m end p a # ← は? a = b p a # ← は? ↑はぁ?? これ、自分であらかじめaをbに格納しておかないと、変数aが迷子状態になるんだけど つうか、そもそも ("a".."c").map do | m | #処理 end このときにイテレータ内で ("a".."c") を参照する術がないの頭おかしいんじゃないの?
912 :
uy :2011/10/03(月) 15:59:56.56
質問なんですけど class A class << self < self p self end end この記述はコンパイルエラーになりません ということは、なんらかのケースにおいて使うってことですか? どんなときに使うのでしょうか? ありえないとはお思いますが まさかバグだっていう事にもかかわらず、エラー表示だせてないで動いちゃってるとか そんな事はありませんよね? 特異クラスに何を継承してもそれは、Falseclassになるという、Ruby独特の特異性はどのような場面において使われるのでしょうか?
913 :
uy :2011/10/03(月) 16:19:47.18
質問です class A @a = 5 @@b = 1 class << self def a p @a end p @a # nil ←はあ? p @@b # 1 ←はああああああああああ???????? class << self def b p @a p @@b # 1 ←はああああああああああああああああああああああ???????? end p @a end self.b end self.a class B p @@b # `<class:B>': uninitialized class variable @@b in A::B (NameError) ←ハァ!?? rescue p :haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa? end end 何度みてもここら辺のネームスペース関係がひどい有様に見えるんだけど、仕様変更くるの? 慣れろっていうの? この、1クラスの中に二種類の@aがあるけど これを使い分けてるやつなんていんの?w バグの元になってるか、「使うな!」っていわれてるだけじゃないの?w @@b が特異クラスのネームスペース突破するのはいいけど、それなら普通のクラスBを突破する@@@c とか用意しないの? なんなの?Ruby2.0いつでんの???
>>911 まずメソッド Array#map! を誤って理解しているように思う。
これは渡されたブロックを評価して、その値でArrayの各要素を更新する。
ここでブロックの評価値とは、ブロック内の最後の文(= endの直前の文)を評価した値。
たとえば
>>911 のコードであれば p m であり、その値は常に nil となる。
また、ブロック内で a.pop や a = ("x".."z").to_a のようなレシーバへの破壊的操作を
しているけど、このような操作は予測不可能なコードになるから避けるべき。
パズルとして言語の裏を遊ぶ事を否定する訳ではないが、その前に Array#map! を勉強しよう。
915 :
uy :2011/10/03(月) 17:11:02.24
ひとつのコードに複数の突っ込みどころを持たせてるからああいうコードになってるだけ 俺が言いたいのは、破壊的メソッドは、 a = ("x".."z").to_a の代入よりも後に a = (イテレータ内で変更されたa) を代入してるんじゃなかったのか? っていう所 イテレータ抜けた後のp aは、俺的には"a","b"であってほしかった けど実際、この動作だと a = ("x".."z").to_a これをやった瞬間に、今までのaは内部でコピーされて コピーされたaがイテレータ内で次から周り、プログラマから見えるaの中身は書き換えられた事になる つまり、もう誰も参照することのできないデータがイテレータで廻ってる事になる それの実行が許されるっていうのはかなり怖い状況じゃないのか? 目隠しして歩いてるようなもんだ せめてselfか何かで参照できれば良いと思うって話
>>888 またそうやって身も蓋もないことを…
>>889 関数テーブルにするメリットは、どんな値が飛び込んできても最初の判定処理にかかる時間が一定になることです。
対して、Rubyのcase〜whenでは、処理速度が可変になります。最初のあたりでヒットすれば判定回数が少なくなりますが、最後のあたりでヒットすれば判定回数が多くなります。
ですが、入ってくる数値のバラつき具合や、該当部分が呼ばれる頻度によっては、実用上気にしなくてもいい場面もあるでしょう。
また、比較できる値の自由度や、ソース書く人間が順番を意識することで最適化できる余地については、Rubyのcase〜whenは利点があります。
さらに、ソースを読む時の理解のしやすさを考えれば、初心者の間は case〜when で書いておいたほうが無難かもしれません。
ちなみに、言語やコンパイラによっては、このあたりを意識せずに書くことができます。
例えばC言語なら、コンパイラの最適化処理によって、テーブルジャンプに出来るswitch〜caseはテーブルジャンプにしてしまいます。
Rubyに比べれば、「case〜whenで書くべきか? テーブルジャンプにすべきか?」と悩む場面は少ないでしょう。
ですので、どちらで書くべきか悩むのは、Rubyという言語だからこそ生じてしまう問題、とも言えます。
…ここまで説明しておけばいいのでしょうか?
>>891-894 ありがとうございます! 参考にして書いてみます
もちろん、両方のベンチマークは測ってみるつもりです
(書き方が分からないのではベンチも取れませんし)
>>895 今、Rubyで横スクロールアクションのゲーム・地形アタリ判定を書いてるのです
地形アタリ判定は、プレイヤー、敵、場合によっては弾すら呼び出す部分なので、利用頻度が高く…
ゲームプログラムにおいて、こういう処理はテーブルジャンプにするのが常識なので、そっちで書いたほうがサンプルとして適切なのか、
それとも処理の流れが理解できることを優先して case〜when のままにしておくか、処理速度云々とは別の部分でも悩ましいです
最終的にバイナリ配布しかしない開発言語と違い、ソースを見せることができるのが Ruby、Python、Perl等のメリット、と思うので…
素直に書いておきたいけれど、それで速度が遅くなったら困るし…
>>915 コードに複数の突っ込みどころを持たせることの目的が、
相手を混乱させて自分を精神的優位に導く事だとしたら、あまり感心できる行為ではない。
もしもそうではないのなら、自分の主張したい事(論点)をできるだけ簡潔に絞って、
それをコードとして表現できる能力を身につけた方がいい。(余計なおせっかいかも)
破壊的メソッドにイテレータが絡んだケースの怖さについては、まあ同感だね。
だから、できるだけmap!よりも(副作用の無い)mapを使う事が望ましいと思う。
919 :
890 :2011/10/03(月) 17:55:12.29
両方書いて比較する前にホントにそこがボトルネックなのかとか
そもそも所望する速度より遅いのかを測ってからでも遅くないと思うんだが、
まあいいや。
ところで 1.9 だと when の値がリテラルならテーブルジャンプ相当の処理に
変換してくれると思ってたんだけどそうはなってないのかな?
ttp://d.hatena.ne.jp/hzkr/20061120
920 :
uy :2011/10/03(月) 18:09:16.43
>>918 精神的優位に立とうとしてるのはお前では?
相手をmap!すら理解していないと勘違いした
あと、よく君の文章を見直してみたら
p メソッドを勘違いしてるよ
p の戻り値はそのままpの引数がくる nilにはならない
破壊的メソッドはmap!だけじゃなく
よく使うものではdelete_ifだってあるし
一概に使わなければよいというものではない
相手を混乱?
そもそもuyという名前で書き込んでいる時点でまともなレスなどは期待していない
ちなみにほかにも、
見えないコードが走っているという状況は、
a = [lambda do
loop do
p a
sleep 1
p a.pop
end
end]
a.first.call
こうやっても作り出せる
>>911 破壊的メソッド実行中のオブジェクトは幼虫から成虫になる前の蛹みたいなもの
変化しつつあるんだから昔の状態はもう無くなっている
それを参照したいなら別にコピーをとっておくしかない
さらに変化中の蛹に手を加えれば正しく変化できるはずもない
>>912 class A
class << ( self < self ) # class << false
def hoge ; p :hoge ; end
end
end
false.hoge
>>913 特異メソッドを定義するとオブジェクトに特異クラスが定義される
class A
class << self ; @a = :a ; end
end
ここで定義された@aはその特異クラスのインスタンス変数になる
922 :
uy :2011/10/03(月) 19:03:25.71
>>921 で?
そんな周知の事実をいまさらドヤ顔で語って。どうするの
この議論に初心者が参加するために、説明してくれてんの?
class A
class << self < self
p self
end
end
つーか、ほんと、これ、何よ、エラーだせよ、パーサのソースコード的に、難しいとか、なんだろうけど、
falseclassになるのは、なんなの?nilclassとか trueclassとか、色々あるけど
マジックナンバーじゃないけど、それにちかいよ。
>>922 class A
a = self < self
class << a
p self
end
end
即値falseはFalseClassのaliasってだけじゃ…
>>922 (
>>912 )
class A .... end の文脈内で self はクラスAを指す。
そして self < self は A < A と同じだから、比較結果は false になる
その false の特異クラスを定義しているから、
定義の文脈内では self の値は FalseClass になる。
特異クラス定義を知っていれば特に難しい事ではないはずだけど、
なぜそれがマジックナンバーとやらになるんだろ?
いったい何を言いたいんだろうか?
単にself < selfがfalseになることを知らなかっただけの希ガス
927 :
uy :2011/10/03(月) 20:13:03.05
継承しているつもりが、なんと比較演算子扱いになってるわけね? falseclassはそれで納得した マジックナンバーであるということは訂正しよう では、特異クラスへの継承はどのようにして書いたらよいのかね?
928 :
uy :2011/10/03(月) 20:18:09.31
まさか module B def a p 9 end end class A class << self include B end self.a end ミックスインは出来るのに、継承は出来ないの?wwwww
929 :
uy :2011/10/03(月) 20:20:29.65
<<と<の演算子の比較順序が違うからこういうことになるんじゃないの?wwwwww
930 :
uy :2011/10/03(月) 20:20:52.71
特異クラス定義というのは特定のオブジェクトだけにメソッド等を追加定義する訳だけど、 特異クラスへの継承とは何を意味/期待しているの? というか、初心者らしく一度リファレンスマニュアルを呼んだほうがいいよ。 そこには、しっかり特異クラスの構文が class `<<' expr と書かれている expr(式)という構文定義だから、self < self がfalseになるというミスも無くなる。 experの値はクラスであるのが一般的だけど、オブジェクトであれば特に制限は無いんだが....
>>931 を訂正
X: self < self がfalseになるというミスも無くなる。
O: self < self がfalseになるのを知らずに勘違いするミスも無くなる。
>>920 >p の戻り値はそのままpの引数がくる nilにはならない
irb> puts (p "A").inspect
"A"
nil
=> nil
Rubyのバージョンは1.8.7
1.9系でpの戻り値が引数をそのまま返すように仕様変更されたのかな?
>>920 pの戻り値はバージョンによって違うから不用意に使わないほうがいいよ
935 :
uy :2011/10/03(月) 21:03:58.91
>>933 なんでメインで1.8系使ってんの
>>932 期待とかじゃなくて
class A < B
これがクラスへの継承なら
class << self < B
これは特異クラスへの継承という風に読めるじゃん
しかし、出来なかった
ミックスインは出来て継承は出来ない現実
そもそも、
class << self < B これを書いたときに < が << より先に評価されているのは、
何か考えあってのことなのか? << を先に評価すると何かまずかったのか?
俺には、特異クラスへの継承は一切考えられておらず、「偶然」そのように動いてるようにしか見えない
936 :
uy :2011/10/03(月) 21:06:37.20
>>934 バージョンによって違うって。
普通こういう場所では最新の安定バージョンを入れてる事を前提で話すんじゃなくて?
古いバージョン使ってる奴は更新してないのが悪いし
1.8使って、それで動かした結果を当たり前のようにバージョンも明記せずにレスしてくるなんて論外もいいところ
>>935 > class << self < B
> これは特異クラスへの継承という風に読めるじゃん
読めません
class << ( self < B )
( class << self ) < B # シンタックスエラー
もし仮にpの戻り値が引数と等しいことを前提にしたのなら、
>>911 のコードは a.map! do |m| m end とほぼ同じ意味になる。
(unless .... end の部分を置いておけば....)
そうであれば、つまりaの各要素をmap!で更新する意図が無かったのなら、
>>911 のコードはmap!ではなくeachを使うべきじゃなかったのかな?
結論を言うと、1.9系を前提にしても、
やっぱりuv君は Array#map! の使い方を知らなかったように見えるな.... 違うん?
やめてあげて!彼の自尊心はもうゼロよ!
940 :
uy :2011/10/03(月) 21:35:31.07
>>937 >読めません
へえ?????? じゃあちょっとRubyやったことない奴に問題だしてみれば?
ずっとRuby使ってるから感覚狂ってるんじゃね?
Rubyは基本 do 〜 endなんだから
( class << self ) こんなこと出来ないに決まってんだろ
括弧つけるなら
( class << self
end) こうなるんだよ
まぁ、このスタイルの限界だね
やるんだったら
class << self.keisyou(B)
class self , B do
end
こうするしかない これならミックスインのほうがマシ
または、
class << self でかなり特例を作っているように
class << self < B や
class << self << B という特例をさらに作るしかないのだろう 特例を作っておらず、
なにやら評価順序のせいで比較演算子扱いになっているのが現状
ゆえに特異クラスへの継承が出来ないのがRubyなのでした
941 :
uy :2011/10/03(月) 21:37:06.33
>>938 その話終わってる
>>940 で、 無理やりにやろうとするとこうなる
module C
def c ; p 9 ; end
end
module B
def < a
extend a
end
end
module A
extend B
class << self < C
end
self.c
end
>>935 >俺には、特異クラスへの継承は一切考えられておらず、「偶然」そのように動いてるようにしか見えない
だから何が言いたいの?
特異クラス定義の構文は class << expr であって、
>>931 で書いたように expr の部分はクラスである必要は無いんだ。
クラスである必要が無いのに、なんで継承が出てくるんだろ?
なんだか特異クラスを一般的なクラスと同一視しているんじゃないのかな?
# だから特異クラスって難しい、初心者には最初のうちは鬼門なんだろうけど....
>>941 >その話終わってる
あ、やっぱり知らなかったんだw
>>940 > ゆえに特異クラスへの継承が出来ないのがRubyなのでした
はい、良くできました。これからも頑張りましょう。
PS.
>>941 は蛇足ですね。
>>> %w(a b c)
=> ["a", "b", "c"]
>>914 >>> r = ('a'..'c')
=> "a".."c"
>> r.to_a
=> ["a", "b", "c"]
>>> r
=> "a".."c"
今日はuv君にいつものキレが感じられない
Haskell勉強してて頭使ったからとかだったりして
948 :
uy :2011/10/03(月) 21:44:34.91
>>942 何が言いたいかって、
気づけよw
あーあ。 設計ミスったなって、言ってる
この先、Rubyは3択に迫られる
1つ、クラスとモジュールを結合する
2つ、基本的に継承はやめて、なるべくミックスインでやる( 今はこの流れか? )
3つ、根幹から書き直すw
>>943 過去ログすら読めないで話しかけるって。さ。失礼をとおりこして荒らしのレベル
>>945 で?
個人的メモは2chのこのスレッドに書き込むべきじゃないと思うよ
ブログでやれ
継承を使いたいなら普通のクラス定義を使えばいいやん なぜに特異クラスにこだわって、それを設計ミスと判断したのか意味不明 結局、特異クラスとは何かを分かっていないだけ
大体特異クラスに何かを継承させたいって何がしたいんだよ 元のオブジェクトは当然クラス決まってるんだし更に継承させられたら多重継承やってるようなもんじゃん Rubyは一般的な多重継承はやらせない方針なんだしそんなものできなくて当然だろ
951 :
uy :2011/10/03(月) 22:08:49.13
>>949 またそこを盛り返すのか
使いたい・使いたくない の問題ではない
Rubyに実装されてるメソッドの中には、1人のプログラマーでは一生使わないようなものも含まれている
お前が使うとか、俺が使うとかいう問題じゃなくて
そこに「存在するのが自然」だという意見かな
結局
>>941 ここのコードはユーザーがかこうとするとmoduleでやるしかない
継承周りがすごく適当じゃね?って事を言いたい
Matzは継承イラネっつってるけど
俺からみれば継承もミックスインも同じで、
ようは先にかけるのが継承、後にかけるのがミックスインって程度で
こんなの最初に継承を実装した奴がちゃんと概念を完璧にしていれば、
継承っていう概念の中にミックスインを飲み込んだはずなのに、なぜか分離してるだけ
class module の分離は良いと思うけどね
>>948 > 個人的メモは2chのこのスレッドに書き込むべきじゃないと思うよ
> ブログでやれ
その言葉、そっくりそのままお前に返すわ
継承もミックスインも一緒って思うのは一人で全て開発するぼっちプログラマの発想じゃね?
見えない人と会話しないでくらさい><;
955 :
uy :2011/10/03(月) 22:13:56.36
>>950 多重継承って言葉を出してくるとはセンスあるな
そうだよ
特異クラスへの継承は、おそらく多重継承の実装と同時に可能になるだろう
多重継承できないのがksなんだよ いわせんな恥ずかしい
>>953 一緒とかいうのではなく、
先継承、後継承って名前でよかったって話。 基本同じなんだから
継承とミックスインなんて、エディタ上のソースコードの行の使い方をどうするかっていうレベルの問題
956 :
945 :2011/10/03(月) 22:24:34.52
>>952 けんかしちゃだめ
純粋に個人的なメモならこんなところに貼らないよ
上段は('a'..'c').to_aとか書くより%w(a b c)のほうが楽でしょって提案だし
残りは
>>914 へのレスだ
ただ「<<」を演算子だと勘違いして八つ当たりしてるだけじゃんか
958 :
uy :2011/10/03(月) 22:29:28.03
>>956 上段は('a'..'c').to_aとか書くより%w(a b c)のほうが楽でしょって提案だし
上段は('a'..'d').to_aとか書くより%w(a b c d)のほうが楽でしょって提案だし
上段は('a'..'e').to_aとか書くより%w(a b c d e)のほうが楽でしょって提案だし
上段は('a'..'f').to_aとか書くより%w(a b c d e f)のほうが楽でしょって提案だし
上段は('a'..'g').to_aとか書くより%w(a b c d e f g)のほうが楽でしょって提案だし
上段は('a'..'h').to_aとか書くより%w(a b c d e f g h)のほうが楽でしょって提案だし
上段は('a'..'i').to_aとか書くより%w(a b c d e f g h i)のほうが楽でしょって提案だし
上段は('a'..'j').to_aとか書くより%w(a b c d e f g h i j)のほうが楽でしょって提案だし
上段は('a'..'k').to_aとか書くより%w(a b c d e f g h i j k)のほうが楽でしょって提案だし
上段は('a'..'l').to_aとか書くより%w(a b c d e f g h i j k l)のほうが楽でしょって提案だし
上段は('a'..'m').to_aとか書くより%w(a b c d e f g h i j k l m)のほうが楽でしょって提案だし
上段は('a'..'n').to_aとか書くより%w(a b c d e f g h i j k l m n)のほうが楽でしょって提案だし
上段は('a'..'o').to_aとか書くより%w(a b c d e f g h i j k l m n o)のほうが楽でしょって提案だし
上段は('a'..'p').to_aとか書くより%w(a b c d e f g h i j k l m n o p)のほうが楽でしょって提案だし
上段は('a'..'q').to_aとか書くより%w(a b c d e f g h i j k l m n o p q)のほうが楽でしょって提案だし
上段は('a'..'r').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r)のほうが楽でしょって提案だし
959 :
uy :2011/10/03(月) 22:29:57.17
>>956 上段は('a'..'s').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r s)のほうが楽でしょって提案だし
上段は('a'..'t').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r s t)のほうが楽でしょって提案だし
上段は('a'..'u').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r s t u)のほうが楽でしょって提案だし
上段は('a'..'v').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r s t u v)のほうが楽でしょって提案だし
上段は('a'..'w').to_aとか書くより%w(a b c d e f g h i j k l m n o p q r s t u v w)のほうが楽でしょって提案だし
上段は('a'..'x').to_aとか書くより%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)のほうが楽でしょって提案だし
上段は('a'..'y').to_aとか書くより%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)のほうが楽でしょって提案だし
上段は('a'..'z').to_aとか書くより%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)のほうが楽でしょって提案だし
("c".."zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz").each do | m |
b = ("a"..m).to_a*" "
puts "上段は('a'..'#{m}').to_aとか書くより%w(#{b})のほうが楽でしょって提案だし"
end
ほとんど三歳児の思考レベルやね
963 :
uy :2011/10/03(月) 22:42:25.17
あー、そっかー。 よく考えたら、 上段は('a'..'pz').to_aとか書くより %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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz)のほうが楽でしょって提案ですね^^;
うざいからさわるな
手にあんこを乗せて
そもそもこういう文脈で○○への継承なんて言ってる時点で継承が分かってないんじゃないかって気になる
ふれるなっつーに
三次→萌え絵スレでも
誤爆!
uyっていうネーミングセンスまったくないよね ハゲそうな貧弱なチビのこじきみたい uってハゲた頭みたいで ウユッって 気持ち悪いな チビでハゲで貧弱 ネーミングにインパクトがない さっさと死ね 迷惑かけるなよここのスレのやつらに
971 :
uy :2011/10/03(月) 23:40:18.32
ほーほけきょ
本気で気持ち悪いなuy 消えろ 死ね 死んでくれよ?早く お前邪魔なんだが 消え失せろ 邪魔だとっとと消えろ雑魚が 死ね汚物 お 前 は 邪 魔だ 帰 れ 2 c h に 書 き 込 む な お 前 に 人 権 は な い
下のほう難易度高いな
>>919 case when の中に手を入れると1フレームあたりのCPU負荷率がグンと増えるので、書き方次第で遅くなるのは間違いないみたいです
もちろん、他に負荷が高い部分があればそっちを最適化すべき、という意見には賛同します
…まあ、Rubyの勉強も兼ねている状態なので、大目に見てください…
Windows7 + Ruby 1.8.7 で測定してみましたが、興味深い結果が出たので一応報告だけ
0..15 の値で、case when とメソッドテーブルを測ってみましたが
when でヒットする場所が3〜4個目を超えるあたりで、メソッドテーブルのほうが速くなるようでした
最善 = case whenの一番最初でヒットし続ける場合、case when がメソッドテーブルより1.2倍速く
最悪 = case whenの一番最後でヒットし続ける場合、case when がメソッドテーブルより2.6倍遅くなりました
つまり、処理速度を稼ぎたいなら(もちろんそこがボトルネック、かつ、入ってくる数値がバラけているなら)、whenの数が4個を超えたあたりでメソッドテーブルに書き換えるのも手としてはアリ、と言えるかもしれないです
…と思ったら、1.9.xでは最適化されてるのですか! 知りませんでした…そっちでも測定し直してみます…
exerb は 1.8まで対応と聞いたので 1.8.7 を使ってましたが…こんなところを気にしてるぐらいなら、1.9 + ocra のほうがいいのかな…
勝てるレスを見つけると、執拗なまで強気に出て、 まるですべてに勝利したかのように悦に浸るとかw
977 :
975 :2011/10/04(火) 00:12:20.58
今、1.9.2 p290で試してみましたが …変です。1.8.7より遅くなってます >case when なんでだろ? 動かす時に何か「最適化しろ!」的な指定が必要なのかな? そのあたりも勉強してみます 何にしてもメソッドテーブルの書き方が分かったので助かりました 教えていただいた方々に御礼申し上げます
そこまでやるならコードと測定方法を晒した方がいいと思うよ
979 :
975 :2011/10/04(火) 00:21:48.02
ごめんなさい。ミスしてました pikでバージョンを切り替えたつもりが 関連付けされてるのは Ruby1.8.7のほうで、ずっとそっちで動かしてました… Ruby 1.9.2 で動かしたら、1.8.7の23倍の速度で動作しました。顎が外れました また、case when もメソッドテーブルも、結果は同じでした こんなことを気にするぐらいなら 1.9 を使うべき、だったのですね… まさかここまで速いとは…1.9、凄過ぎます…
ocraなんてものがあったのか。勉強になった
981 :
890 :2011/10/04(火) 00:51:51.90
げ、そんな速いのか。俺もそろそろ 1.9 に移行すべきか・・・ つーかさ、 1.9 に詳しくないどころか使ってさえない俺でも思い当たった case when の最適化の件に ここまで誰一人として言及してこないってのは一体どういうことなんだよ。 お前らもっとしっかりしろよオラ。 お前ら 1.9 とかもう使っちゃったりなんかしちゃってんだろオラオラ。
982 :
uy :2011/10/04(火) 01:13:22.08
>>981 思い当たったからルックアップテーブルにしても
早くならないと思うよって書いたんだYO
984 :
890 :2011/10/04(火) 07:37:58.71
>>982 お前に言われたないわ、ボケ。
お前のレスにも明らかに何も読んでねーだろってのが大量にあるぞ。
>>983 いや、だからそれ思い当たったなら言ってくれよってな話で。
>>984 見えない人と会話しないでくらさい><;
986 :
uy :2011/10/04(火) 20:33:14.82
>>984 あのさ、あのさあ、俺がいってんのは、
なんでそんなレベル低いのにドヤ顔なんだ?って話
キモいんだけど・・・
981 :890:2011/10/04(火) 00:51:51.90
げ、そんな速いのか。俺もそろそろ 1.9 に移行すべきか・・・
つーかさ、 1.9 に詳しくないどころか使ってさえない俺でも思い当たった case when の最適化の件に
ここまで誰一人として言及してこないってのは一体どういうことなんだよ。
お前らもっとしっかりしろよオラ。
お前ら 1.9 とかもう使っちゃったりなんかしちゃってんだろオラオラ。
987 :
uy :2011/10/04(火) 20:35:54.89
初心者の域すらでていないで、
このスレッドで質問する側にいるんなら、もうちょい謙虚な書き込みをしろよゴミカス
いいからさっさと
>>982 これ全部読めって。 読み終わるまでスレッドに二度と書き込むな
速読身に着けろカス
>お前ら 1.9 とかもう使っちゃったりなんかしちゃってんだろオラオラ。
988 :
uy :2011/10/04(火) 20:41:34.28
「もう」ってなんだよ いまさら1.8使ってるほうが頭おかしいんだよ なんで何も情報みえてねーんだよ なんで日本語資料こんだけ多いプログラミング言語つかってて、 情報追えないんだよ 追う気がないんだよ 「英語だから無理ですw」っていってるやつって日本語でも無理って本当かもな・・・・ ふ ざ け ん な カ ス 初心者 死 ね
989 :
uy :2011/10/04(火) 20:44:04.16
>
>>983 >いや、だからそれ思い当たったなら言ってくれよってな話で。
はぁ????? マジなめてんなお前
屋上
990 :
uy :2011/10/04(火) 20:48:05.56
初心者は全員死ね
ごめんなさい
992 :
uy :2011/10/04(火) 20:51:25.20
ぁああああああ?????
993 :
uy :2011/10/04(火) 22:03:14.78
初心者ふざけんな
994 :
uy :2011/10/04(火) 22:05:39.58
ざけんな
995 :
uy :2011/10/04(火) 22:19:33.23
は?
996 :
uy :2011/10/04(火) 22:21:36.18
左を見ろ 左を見ろ 右を見ろ 右を見ろ 右を見ろ 下を見ろ 左を見ろ 右を見ろ 左を見ろ 左を見ろ 右を見ろ 下を見ろ 上を見ろ 左を見ろ 上を見ろ 下を見ろ 下を見ろ 上を見ろ 下 を見ろ 左を見ろ 右を見ろ 右を見ろ 左を見ろ 左を見ろ 下を見ろ 上を見ろ 上を見ろ 上を 見ろ 上を見ろ 下を見ろ 下を見ろ 右を見ろ 下を見ろ 上を見ろ 左を見ろ 左を見ろ 右を見 ろ 右を見ろ 左を見ろ 右を見ろ 下を見ろ 下を見ろ 左を見ろ 左を見ろ 右を見ろ 上を見ろ 下を見ろ 上を見ろ 上を見ろ 右を見ろ 右を見ろ 左を見ろ 右を見ろ 右を見ろ 左を見ろ 下 を見ろ 上を見ろ 左を見ろ 右を見ろ 上を見ろ 上を見ろ 右を見ろ 上を見ろ 上を見ろ 上を 見ろ 上を見ろ 右を見ろ 下を見ろ 下を見ろ 右を見ろ 上を見ろ 左を見ろ 左を見ろ 左を見 ろ 下を見ろ 下を見ろ 上を見ろ 下を見ろ 右を見ろ 右を見ろ 上を見ろ 右を見ろ 下を見ろ 右を見ろ 下を見ろ 下を見ろ 上を見ろ 左を見ろ 左を見ろ 上を見ろ 右を見ろ 下を見ろ 右 を見ろ 左を見ろ 左を見ろ 上を見ろ 下を見ろ 右を見ろ 下を見ろ 左を見ろ 上を見ろ
997 :
uy :2011/10/04(火) 22:22:38.65
は?
998 :
uy :2011/10/04(火) 22:23:14.67
は>
999 :
uy :2011/10/04(火) 22:24:16.91
'´ `丶 / \ / r ヘヽ ,' ノ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l〈 | | |│ | | _ト,L_ | -=┴:┬: ァ : :7T:7下:/「:、 : !\ |ノ 厶イ:/! /-孑'´|/ |/二jハ:リ│ . / l: j,斗テ圷 弋iナ小/ ,| | |Vヘ弋)ン `´ i:|∨| はぁ j/ ,'| '' ' '': |: ' | / /.:|丶、 f^ーァ' イ: :|: : | これだから 童 貞 は / /|: :|(ヽl> `_ー_. イ:!:| : |: ハ / /-|: :|(>、` ー‐┴' ∧L| : !/: : '. . / ∧. |: :l \ ノ/ } |: :|ヽ: : :i / / ハ.|: :ト.、 \ー‐ / ,/ |: :| ∧: :| . ,′ / |: :l \ \/ / i|: :l/ '; :| ./゙) . \ __ | / l|: :| \ /\/ |i /l |│ / 'ー--っ_ }`ト、|, / l|: :| 〈=-O-〉 |: | |. │| __xく -‐=彡' \ | l| \ | ||: :| /\__∧ |: | |. W /\ l| '´ ̄ | l| |\j ||: :| ./ ∧ l |: | | 八 /\ │ レ' | l| | }ヽ ||: :| / / | | |: |ノ } / | | |
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。