912 :
uy :
2012/05/03(木) 20:20:49.11 質問です これってバグですか? class O attr_accessor :x end o = O.new o.x = 99 o.instance_eval do p x #=> 99 if nil x = 2 # この記述があるとxがなぜかnilになる end p x #=> nil end
頭のバグです
914 :
uy :2012/05/03(木) 20:26:57.15
まじめに答えてほしいんですけど? また今日もuyさんがコミットしてきてもいいですが、バグじゃなかったら恥ずかしいので聞いています
915 :
uy :2012/05/03(木) 20:32:48.62
もういいやいってこよう こんなスレしんでしまえ
バグじゃないよ。最初の x と if nil 後の x は別物になっている。 よく知られたRubyの落とし穴の一つで、ローカル変数によるメソッド呼び出しの隠蔽。 しいて言えば仕様のバグだね。 o.instance_eval do p x #=> 99 nil rescue x = 2 p x #=> nil p self.x #=> 99 end
独り言 def x() :method_x end p x # => :method_x 1.times do x = nil # ローカル変数のスコープ開始 p x # => nil end # xのスコープ終了 p x # => :method_x 1.times do x = 99 if false #代入は実行されないけど ローカル変数のスコープ開始 p x # => nil #存在してるけど中身が未定なのでnilが入っている end # xのスコープ終了 p x # => :method_x
なんの話?
変数の宣言は静的に行なわれるという話かと思った そういう解釈でいいのかな
ピッケルにもさらっと書いてあった。2/e, p. 324 > Note that the assignment does not have to be executed -- Ruby just has to > have seen it. This program does not raise an error. > > a = 1 if false; a たぶんフラナガン本にも書いてあるんだろうなあ JavaScriptでも似たようなこと起こるし
1.times do p local_variables # => [:x] #スコープ外だけどxも列挙されてる x = 99 # ローカル変数xのスコープが始まる p local_variables # => [:x] end # ローカル変数xのスコープ終了 ローカル変数x がどこのブロックに属しているかは実行前のパース時に決定されているので 最初のp local_variables ですでにローカル変数xが存在することになってしまっている アクセスすることはできないけど
1.8と1.9で local_variables の結果が違うのよね # o.instance_eval の最後に p local_variables を追加した結果 1.9.2 => [:x, :o] 1.8.7 => ["o"] ちなみに p x がnilになるのはどっちも同じ
1.8 の local_variables の動きはきっとバグ。 あと動的言語な利用者の視点からすると、宣言を兼ねた代入式(それが実行されるか否かによらず)より 前の local_variables で :x は列挙されるべきではないし、1.9 のように最初から列挙するなら逆に ひとたび :x の存在が観測されたら、その時点から x はローカル変数へのアクセスになって nil を 返してくれるようになっていればもっと自然だった気はする。もちろん、宣言式が実行されない限り ローカル変数が増えないのが一番自然なのだろうけどね。
924 :
uy :2012/05/04(金) 05:56:17.36
俺としては、o.xを@xとかじゃなくてxでアクセスする手段が欲しかった
925 :
デフォルトの名無しさん :2012/05/04(金) 06:48:32.28
def class; :a end # 通る def self; :a end # syntax error 下はバグ? シンボル以外にもいろいろある 予約語の中でも擬似変数だけ通らないみたい
そんななんでもかんでもバグだバグだって …… メソッド定義がシンボル1個だけの行だけのとき、SyntaxErrorになるな irb> class C; def self; :a; end; end SyntaxError: (irb):1: syntax error, unexpected ':' irb> class C; def self; ; :a; end; end => nil irb> ……うん、メソッド定義内部によるんじゃこれはバグって言っていいと思う
>>924 後半は他言語の人なら解らんでもないが
Rubyにおける「o.x」と「oのインスタンス変数@x」は違うモノだぞ
o.x は「oのメソッド」でしかない
その処理内容は @x にアクセスしているかも知れんがね
attr系なんかを勘違いしてる人を結構見かけるが
あれは「公開フィールドを定義している」ワケではなく
「特定のインスタンス変数にアクセスするメソッドを楽に定義する方法」なだけだからな
>>926 ありがと。やっぱバグか
他には括弧類([]とか)や%q()みたいな%リテラルも駄目みたい
selfって名前のメソッドが定義できるのにびっくり 普通には呼べないけど def self() :self end # メソッド定義できる p send(:self) # => :self def self;; :self2 end # これもメソッド定義できる p send(:self) # => :self2 def self; :self end # syntax error, unexpected ':' バグかもしれないけど 予約語のメソッドを定義することなんてあるのだろうか? def if() :if end; p send(:if) #=> :if def end() :end end; p send(:end) #=> :end def class() :class end; p send(:end) #=> :class def begin() :begin end; p send(:begin) #=> :begin def if; :if2 end; p send(:if) #=> :if2 def end; :end2 end; p send(:end) #=> :end2 def class; :class2 end; p send(:class) #=> :class2 def begin; :begin2 end; p send(:begin) #=> :begin2
class Object def self p :test # この行がなければ通る self end end [0, 1, 2, 3, 3, 2].group_by(&:self) ちなみにMLでself定義するの見てこんな風に実験してたら気付いた 自分も普通は使わないと思う
932 :
デフォルトの名無しさん :2012/05/04(金) 13:31:16.62
__ノ)-'´ ̄ ̄`ー- 、_ , '´ _. -‐'''"二ニニ=-`ヽ、 / /:::::; -‐''" `ーノ / /:::::/ \ / /::::::/ | | | | | |:::::/ / | | | | | | | |::/ / / | | || | | ,ハ .| ,ハ| | |/ / / /| ,ハノ| /|ノレ,ニ|ル' | | | / / レ',二、レ′ ,ィイ|゙/ 私は只の数ヲタなんかとは付き合わないわ。 . | \ ∠イ ,イイ| ,`-' | 頭が良くて数学が出来てかっこいい人。それが必要条件よ。 | l^,人| ` `-' ゝ | さらに Ann.of Math に論文書けば十分条件にもなるわよ。 | ` -'\ ー' 人 一番嫌いなのは論文数を増やすためにくだらない論文を書いて | /(l __/ ヽ、 良い論文の出版を遅らせるお馬鹿な人。 | (:::::`‐-、__ |::::`、 ヒニニヽ、 あなたの論文が Ann of Math に accept される確率は? | / `‐-、::::::::::`‐-、::::\ /,ニニ、\ それとも最近は Inv. Math. の方が上かしら? | |::::::::::::::::::|` -、:::::::,ヘ ̄|'、 ヒニ二、 \ . | /::::::::::::::::::|::::::::\/:::O`、::\ | '、 \ | /:::::::::::::::::::/:::::::::::::::::::::::::::::'、::::\ノ ヽ、 | | |:::::/:::::::::/:::::::::::::::::::::::::::::::::::'、',::::'、 /:\__/‐、 | |/:::::::::::/::::::::::::::::::::::::::::::::::O::| '、::| く::::::::::::: ̄| | /_..-'´ ̄`ー-、:::::::::::::::::::::::::::::::::::|/:/`‐'::\;;;;;;;_| | |/::::::::::::::::::::::\:::::::::::::::::::::::::::::|::/::::|::::/:::::::::::/
メソッド名ってなんでもいいのか self.class.class_eval do define_method(:'a+b-c*d/e;'){ :foo } end p send(:'a+b-c*d/e;') # => :foo
まあ、流石に呼ぶときに毎回sendは面倒いけどな
空白が入っていても大丈夫だぞ どうやっても普通には呼べないけど
>ArgumentError: symbol string may not contain `\0' 本当に任意のバイト列でいいのかと256種類試してみたら\0だけ駄目なんだな エラー内容からするとシンボルを使うことによる制限っぽいけど
>>936 内部的にはC文字列か何かでやってんのかな?
Rubyのソース読み慣れてないからよく解らんが
むしろ今日思ったのはシンボル高性能過ぎワロタ
目的から考えても英数字と一部の記号だけで充分だろうに…
ハッシュについての質問です。 楽天APIにリクエスト送ると {"Body":{"ItemRanking":{"Items":{"Item":[{"pointRate":1,"shopOfTheYearFlag":0,〜(以下略) みたいにネストされまくったJSONを返してくるので、ハッシュに変換し、 h = JSON[rak] if h = h["Body"] if h = h["ItemRanking"] if h = h["Items"] if h = h["Item"] if h = h[0].to_hash h = h["affiliateUrl"] end end end end end みたいにしてkey="affiliateUrl"の時のvalueを得ているのですが、 私は根本的にハッシュの使い方を勘違いしているのでしょうか。 もっと簡単に(一行で"affiliateUrl"キーにたどりつけるように)書けるはずだよなあと思うのですが。
ネストされたコレクションなら仕方ない Rubyのネストされた配列やネストされたHashは番地管理されている「多次元配列」ではないので、 ひとつずつオブジェクト取り出してnilでないことを確かめてメソッドで個別にアクセスするしかない h = {'aaa' => {'bbb' => 'ccc' => {'ddd' => 'value'}}} から value 探すのを ChildAccess.new(h)['aaa/bbb/ccc/ddd'] みたいに書けるライブラリがあったら便利かなあと思ったことはちらっとある
response = "{"Body":{"ItemRanking":{"Items": ..." json = JSON.parse(response) url = json["Body"]["ItemRanking"]["Items"]["Item"][0]["affiliateUrl"] rescue nil
941 :
938 :2012/05/04(金) 23:59:43.29
ありがとうございます。 そういうものなのですね。
942 :
938 :2012/05/05(土) 00:02:21.08
>>940 おおっ!
JSONモジュールのドキュメント見ても
どうやって使うのかさっぱりわからなかったのですが
こういうことできるのですね!
ありがとうございます!
943 :
デフォルトの名無しさん :2012/05/05(土) 00:36:10.88
php、javascriptでプログラミングを初めて1年くらいで、 オブジェクト指向を覚えるために最近になってrubyを触り始めました 他の言語はある程度触っていたため、rubyの文法や全てがオブジェクトであるという概念などはなんとなく把握できています クラスとかメソッドとかpublic、privateがどういう動作をするものかということも理解できたのですが 自分で実際にこれらを使ってプログラミングに活かせているか自信がありません githubなどで公開されているソースで、 オブジェクト指向・rubyどちらも初心者な人にも分かりやすいソースがあれば教えて下さい
privateに関してはオブジェクト指向とはほとんど関係がなく、あくまで個々の言語の実装でしかない だから、publicやprivate(やprotected)の使用に関して、なにか"オブジェクト思考"として気にする必要はない クラスとメソッドとオブジェクト(=インスタンス)が普段使えるくらいにわかってればそれでいいんじゃないの
さらっと嘘書くあたり只者じゃない
>>945 オブジェクト指向とは関係ないって
どの言語でもただのアクセス制御だもの
きちんとオブジェクト指向で実装されてる例を知ってたら教えてくれ
webrickのソース読めって記事は見たことがある。
>>947 それには大事な前提条件がある
「普段からWEBrick使ってる人は」
WEbrickってなにそれ聞いたことない、というような人が読んでも糞構造の自己満ソース
Rubyによるメタプログラミングの初期の実践例。 あれを糞構造の自己満とか言う奴はバカ。
950 :
uy :2012/05/05(土) 09:40:22.28
WEbrickファイル数が多いんだけど ファイルがメタプログラミング凄いのか教えてください
951 :
uy :2012/05/05(土) 09:40:46.70
ファイルが ↓ どのファイルが
AAA周りのハンドラ実装をしようと思うんですが、mod_rubyやmod_mrubyはどうでしょうか? まだ従来通り mod_perl で実装したほうがよさげでしょうか
953 :
デフォルトの名無しさん :2012/05/05(土) 13:45:12.31
AAAってなぁに?
mod_authen や mod_authez 周りのフックを実装したいのです
module内の特異メソッドをincludeした場所で使えるようにさせる良い方法ってないのでしょうか? module A class <<self def f p 1 end end end A.f include A f # ここで呼び出したい
rubyのメソッドの命名規則って何か代表的なものありませんか? has_key?みたいに三人称単数があると思いきや、 equal?みたいなのもあったりで、記憶があやふやになりがち。
それは「してはいけない」 ユーザーの利便性を上げていると見せかけて実際は物凄く下げている 素直にsetupとかなんか適当なメソッド作って呼んでもらえ
なんで利便性下がるんだ? そーいうのがあってもいいんじゃまいか
959 :
デフォルトの名無しさん :2012/05/05(土) 17:53:12.55
>>956 真偽を判定するものについてでよいのかな。
* is を付けずに、 疑問符を付ける。
** has_key? と is_a? が例外。
** has_key? は key? で置き換えられたので今後は考慮しなくてよくなる予定。
コアライブラリ部分はそうなってるはず。
残念ながら、ActiveSupportみたいなサードパーティ製ライブラリは三単元の形になってることが多い。
>>959 なるほど、たまたまhas_key?みたいな例外に気を止めてしまったみたいですね。
ありがとうございました。
is_a? はそれ以上分解すると、オブジェクト指向用語としての「is-a関係」という言葉から乖離してしまうからだろうね has_key? は is_xxx? と違って「レシーバ自体がキーか?」という意味ではないから key? ではなく だからと言って has? だとキーと値、どっちを尋ねてるのか判らんからそういう名前だったんだと思う 結局 key? になったのは「レシーバ自体がキーかどうか訊く場面なんて無くね?」ってことなんじゃないかな
>>957 require "dl/import"
module M
extend DL::Importer
extern "int func( void )"
# ...↓いっぱい関数
end
これを
M.func
とかじゃなくて
func で呼び出したかったんですよね
特に機能がなければevalでやるしかないかなぁ
module_functionとかで工夫できないの?
dl/import.rb を見ると @func_map とか @handler とかにライブラリの情報詰め込んでるから func で呼び出しちゃうと M ではなく main オブジェクトの @func_map を読みに行って失敗すると思う extern が返す DL::Function をうまく使って Kernel に define_method するように extern を上書きすると楽じゃない?
965 :
962 :2012/05/05(土) 22:22:29.08
もうevalでかいて動いたので 今回はそれでいくことにしました レスありがとうざいます
すいません。いままでずっとわからなったんですが def self.[]のself.[] とういう表示ってどういう意味なんですか?僕はつかわないんで 読み飛ばしてました。 よろしくお願いします。
>>966 class記述中の話だとすれば、そのselfは作成中のクラスそのものを表すので
クラス自身に[]というメソッドを定義するということになる
もしclass文の外やdef記述中の表記なら
状況限定でそのインスタンス自身に[]を定義することになるが…あまり見たことがないな
1/2(50%)で分岐したいときの綺麗で簡単な書き方とかってありますか? 自分は if rand(2) != 0 #処理 end とかでやっているんですが他にいい書き方があれば教えてください
書き方としては特にない 技巧的に書いても読みにくいんじゃ仕方あんめえ あとなにもなければ肯定で書いて欲しい if rand(2) == 0
970 :
uy :2012/05/07(月) 08:40:00.02
ゲームじゃなかったらスルーしていいけど ifが0でもtrueだからゲーム系ではちょっと戸惑う箇所 俺様だったら頻繁に使う場合true_rand,false_randとかってメソッド定義するわ
>>968 綺麗簡単てわけじゃ無いけどこんな方法もあるって事で
table = [
proc { "0の時に実行する処理" },
method('1の時に呼び出すメソッド'),
]
table[rand(2)].call
def event_0 ; ... ; end
def event_1 ; ... ; end
method('event_%d'%rand(2)).call
def event_hoge ; ... ; end
def ev_hage ; ... ; end
table = [:event_hoge,:ev_hage]
method(table[rand(2)]).call
読みやすさ考えるなら適当に関数定義して
if coin()とかif percent(50)とか書けると素直に読めていいよね
後
>>971 の亜種で
event = [ 処理A, 処理B, 処理C, … ]
event.sample.call
とか。3つ以上の処理を等確率で実行したい場合に
event[rand(event.length)]って書かずに済む
if [true, false].sample はまあキザっぽいとは思う。
>>969-973 みなさんありがとうございます。
1/2の分岐だけでもいろんな書き方があるんですね。
初心者な者で勉強になります。
いろいろ調べると
>>969 さんが言うように否定形は良くないみたいなので
今後は肯定形で書いていこうと思います。
一定の確率で分岐するならrand使うのが一般的だからそれで良い。
rubyで、Enumerable#grep()の逆を行うにはどうしたらいいですか。 つまりある正規表現に一致しないものを選びたい場合です。 正規表現に否定があれば話が簡単なのですが。
頭使わないで思いついたのは reject p %w(apple orange melon).reject{|e| (/a/ === e)} ["melon"] うむ、なんか grep にくらべてこうなんかちょっと外見がイマイチっすな reject の別名なんだっけ reject だけ無いんだっけ?
正規表現のいろいろな罠は知ってるという前提でいろいろはしょるけど、 Rubyの正規表現には否定先読みがあるよ。
p %w(apple orange melon).grep(->x{/a/ !~ x}) p %w(apple orange melon).grep(/a/.method(:'!~').to_proc) p %w(apple orange melon).select(&/a/.method(:'!~')) p %w(apple orange melon).reject(&/a/.method(:=~)) p %w(apple orange melon).reject{|x|/a/ =~ x} 普通のrejectでいいんじゃね?
否定先読みで任意の単語が含まれない表現は出来るけど 面倒くさいし、読みにくい p %w(apple orange melon).grep(/\A((?!a).)+\z/m)
983 :
uy :2012/05/08(火) 21:24:46.29
a=%w(apple orange melon) p a-a.grep(/a/)
回りくどいことしないでreject使え。 慣れの問題
見てくれはArrayだけど実はテキストファイルにマッピングされてて arr << "hello" とかやると即テキストに書き込まれるようなクラスって作れます? Array.onchangeイベントハンドラみたいなのがあればいいんだけど。
>>985 メソッド上書きすれば?
class MyArray < Array
def initialize(textfile) ; @textfile = textfile ; end
def <<(s)
File.open(@textfile,'a'){|f| f.write(s) }
super
end
end
arr = MyArray.new('hoge.txt')
arr << 'hello world'
987 :
デフォルトの名無しさん :2012/05/08(火) 23:12:50.33
[]= あたりのデータのずらしが発生するやつは面倒かな。
988 :
デフォルトの名無しさん :2012/05/09(水) 00:16:34.95
989 :
uy :2012/05/09(水) 00:47:22.66
Rubyまたバグかよ バギーすぎて使い物にならねーぞ
バギクロスw
993 :
デフォルトの名無しさん :2012/05/09(水) 02:01:29.03
>>988 six = 6
six.+(2) #=> 8 なら分かる?
それでもダメなら six.add(2) #=> 8 は?
994 :
デフォルトの名無しさん :2012/05/09(水) 02:01:47.58
あ、addというメソッドがあるわけではないです。
うめ
z
::::::::::::::::::::::::::::::::: _____/へ、__ :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: 「 l::::::ヽ-、__;::ゝ-──-- 、..,,_ :::::::::::::::::::::::::::::::::::: _________ | l:::;:ゝ''" `ヽ、 ::::::::::::::::::::::::: ヽ !.‐┼‐ ! //:7 `ヽ. ::::::::::::::::: 7 lΞ|Ξl .う ::::i-、_,.ゝへr-、____,.ィ_へノ ', :::::::::::::: ). ‐┼‐ 「へ_r'‐-、_'r‐へ__,.-'"ヽ_「´ヽイ-、 i ::::::::::::: ⌒`''ー─‐' ん i/´ .7 ハ , , 、 ヽ.`'ー、__7、_| :::::::::::: /\ イ イ ノヽ!、 .ハ /| ハ ,:!イカ ヽ._」、_イ ::::::::::: /──\. め ' レ,イ:,rt=ゝ;、V:::! /;イ-=t!、:::! ',____7、 ::::: | ̄|| ̄| レ' .ハ弋__r!:::::::レ':::弋__rリノ::! ! ハノ !、___> :::: .  ̄ | ー' い イY / ! " ""/レ'V | ::::::::::::: ヽ __マ_ / ! 人 、_________,. 〈/ |. ハ ::::::::::: 7 |‐┼‐| ど 〈 ! !>.、 ` ー‐' _,,.イ/ ./イ 〉 :::::::: ) .ノ‐┼‐,! .ノレヘ! ノイ<、__`'7=ニ7´/ rレ'V、 ハ/ V iヽ. :: ⌒`''ー─‐' お、 !ィレ'イ ヽ/ムヽ、/」 、/`ヽ( ::::: /::::::ヽ ! ,'⌒ヽ. /::::ヽ、//)、r、_rン Y(ハ_r、_(\! ヽ./:::::::::::: レ' ! ./:::::::::: !,イ '─---、)Y ,.-─‐-' `ヽ. i:::::::::::::::::: __.ノ ::::::::::: ハ -‐=='、ハ `,==‐- i. ,.、〉、::::::::::::::
,,.. -──-- 、.,_ ,. '"::::::::::::::::::::::::::::::::::::`ヽ. ,.':::::::::::::::::;::::::::::::::::::::::::::::::::::ヽ. /__二ニ=-ハ::::::i:::__i_::::::、::::::::::::', /:::/::::::ハ::::::! !::::ハ::__!_::::::::';:::::::::::i i::::i:::::/!:,!ニ、! L:! ',.‐;.、ヽ!::::i:::::::::::| |::::!:::ハ i' i'`! ト r! ' !__」::::::i:::| └-iヽ::! ゞ' , `''´,,, |::::!::::::::|:::| .|::::7" r─、 .レi::::::::::|:::| レ'iゝ、 ヽ.__」 ,イ:::|::::::i::::|::::| !::::!::i:>ー-r i;:-!::::|::::::|::::|::::| |::::|::::::rイ´!__/ |::::ト.、::|::::|::::| |::::|>'´}><{.、 |::::|/ヽ:::|::::| !ヘ|ヽ、/_」L_ゝ `ヽレ' ';:|:::::| !/ !/ oio i ';::::::| / r/'⌒i !. ヽ::::! / ,-rイ、___,ノ._ ハ \! !/ | l ,ィ'l |o _,.!', `'r、 |. | l'´::::l |<{_____,.イ'" ヽ::', //、! ゝ、ヽヽ-'ハ_____,,.ハ__,.イヽ;\ //っ ) !::7'ー´:::!:::::::::::::!::::::::::::::::ヽ;:`Y´「T´ |:/:::::/:::::!::::::::::::::!::::::::::::::::::::ヽ;:!::::!::|
1000 :
uy :2012/05/09(水) 08:10:14.90
三 さ ,.-‐-、 Ξ バ て ,.-─-、 / ! 三 グ ` / i ',__,,,,.....i i | Ξ が ま i /、_,!::::::::::::'-'、___,.ノ、 三 で た ヽ、__,./ ;::::i::::;:::;: :;::::::ヽ. × Ξ た R × ,.イ::::/:::::レ::ハ:!、!__,.ハ::ル:::::', × 三 訳. U レ::::::レ:'r‐'i´ レ',!'-'、。o:::::::::ヽ Ξ だ. B ハ::o。!'⌒ " ハ:::ハ::::,.-'、. 三 が Y .゜i:::::7" i' ̄`i /:::!::::::::/ @i 彡 の イ:::人 ヽ ノ i::::ハ::::/ /、 / 川 l | l l | l | V::ハ::>ー-r‐='T´V,.イ ー、/`ヽ × ` ,.く,.〈〉、_,.イ ヽ、___ノ、/ノ × r〈 ! ヽ、___二ン 7ヽイ__,.'-っ、 〈 ,,.. 〈  ̄ ノ 、 `ヽ ゛ `ー7''" ̄´ ヽ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。