From: keiju@... (ÀÐÄÍ·½¼ù ) Date: 1997-03-21T00:59:45+09:00 Subject: [ruby-list:2397] Re: eval()'s context ã‘ã„ã˜ã‚…ï¼ SHLジャパンã§ã™. In [ruby-list :02395 ] the message: "[ruby-list:2395] Re: eval()'s context ", on Mar/20 03:07(+0200) Shin-ichiro Hara writes: >ãã†ã„ãˆã° binding を使ã£ãŸã“ã¨ãŒãªã‹ã£ãŸã€‚(^^; >ã©ã†ã‚„ã£ã¦ä½¿ã†ã‚“ã§ã—ょã†ã€‚ >例をã‚ã’ã¦ã„ãŸã ãã¨ã‚りãŒãŸã„ã®ã§ã™ãŒã€‚ 実用的ãªä¾‹ã¨ã—ã¦ã¯, debug.rb ãŒä½¿ã£ã¦ã„るらã—ã„ã§ã™. >> eval()を用ã„ãŸãƒ¡ã‚½ãƒƒãƒ‰å®šç¾©ã£ã¦2段階ã«ãƒˆãƒªãƒƒã‚­ãƒ¼ãªã®ã§ã‚ã¾ã‚Šä½¿ã£ã¦ã„ã‚‹ >> 人ã¯ã„ãªã„ã§ã—ょã†ã­. >> >> 1段目: クラス文(class ...)ã«ã‚ˆã‚‹ã‚¯ãƒ©ã‚¹å®šç¾©ã¯è¤‡æ•°ã§ãã‚‹. > >ã“れ㯠eval を使ã‚ãªãã¦ã‚‚ãã†ã§ã™ã‚ˆã­ã€‚例ãˆã°ã€ (中略) >ã¿ãŸã„ã«ç¶šã‘ã¦å®šç¾©ã§ãã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã‚ˆã­ã€‚ >ãã†ã„ã†äº‹ã˜ã‚ƒãªã„ã®ã‹ãªã€‚ ãã†ã§ã™. 原ã•ã‚“ã¯ã¨ã‚‚ã‹ãã¨ã—ã¦çŸ¥ã£ã¦ã„る人ã¯å°‘ãªã„ã‚“ã˜ã‚ƒãªã„ã‹ã¨æ€ã£ ãŸã‚ã‘ã§ã™. ã§ã‚‚, ã“れã£ã¦æ—¢å­˜ã‚¯ãƒ©ã‚¹ã¸ã®ãƒ¡ã‚½ãƒƒãƒ‰è¿½åŠ ã§ã‚ã£ã¦, æ–°è¦ã‚¯ãƒ©ã‚¹ã®å ´åˆã¯é–¢ ä¿‚ãªã‹ã£ãŸã§ã™ã­. >> 2段目: evalを用ã„れã°, å‹•çš„ã«(文字列ã‹ã‚‰)メソッド/クラスを定義ã§ãã‚‹. >ã“れも「文字列ã‹ã‚‰ã€ã¨ã„ã†ç‚¹ã§ã¯ eval ã ã‘ã©ã€ã€Œå‹•çš„ã«ã€ã¨ã„ã†ç‚¹ã§ã¯ >eval ã®ç‰¹å¾´ã§ã¯ãªã„ã§ã™ã‚ˆã­ã€‚ (中略) >ã¨ã†ã‚³ãƒ¼ãƒ‰ã¯æˆç«‹ã™ã‚‹ã€‚ 確ã‹ã«ã“れも動的ãªãƒ¡ã‚½ãƒƒãƒ‰å®šç¾©ã§ã™ã­. ç§ã®è¡¨ç¾ãŒæ‚ªã‹ã£ãŸã§ã™. 次ã®ãƒ¡ã‚¤ ãƒ«ã®æœ€å¾Œã®ä¾‹ã«ã‚るよã†ãª å‹•çš„ã«ãƒ¡ã‚½ãƒƒãƒ‰å®šç¾©æ–‡ã‚’生æˆã™ã‚‹ã‚ˆã†ãªã“ã¨ã« evalを用ã„ã‚‹ã“ã¨ãŒã§ãã‚‹ã¨ã„ã„ãŸã‹ã£ãŸã®ã§ã—ãŸ. In [ruby-list :02396 ] the message: "[ruby-list:2396] Re: eval()'s context ", on Mar/20 04:36(+0200) Shin-ichiro Hara writes: (中略) >ã§ã‚‚ã€æ¬¡ã®ä¾‹ã‚’考ãˆã¦çŸ³å¡šã•ã‚“ã®è¨€ã£ã¦ã„ã‚‹æ„味も >分ã‹ã£ãŸæ°—ãŒã—ã¾ã—ãŸã€‚ > >$input = "abc" >def bar > print "input = #$input\n" >end >$input = "efg" >bar # => input = efg >$input = "abc" >eval("def bar > print \"input = #$input\n\" >end") >$input = "efg" >bar # => input = abc ã¨ã“ã‚ã§ç¾åœ¨, ç§ã¯ã‚½ã‚±ãƒƒãƒˆã®é€šä¿¡ãƒ—ロトコルを簡å˜ã«å®šç¾©ã§ãã¦é€šä¿¡ãŒè¡Œãˆ るよã†ãªãƒ©ã‚¤ãƒ–ラリを作æˆä¸­ãªã®ã§ã™ãŒ, ãã®ä¸­ã®æ©Ÿèƒ½ã®ä¸€ã¤ã¨ã—ã¦ãƒ—ロトコ ル仕様をpack/unpackã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®æ‹¡å¼µã¨ã—ã¦ä¸Žãˆã‚‹ã¨, ソケット㮠read/writeã®rubyメソッドを動的ã«ç”Ÿæˆã™ã‚‹ã‚ˆã†ãªæ©Ÿèƒ½ãŒã‚りã¾ã™. 例ãˆã°, "na$1"ã¨ã„ã†æ‹¡å¼µãƒ•ォーマットã¯, $1ã¯æœ€åˆã®"n"ã®ä¸­èº«ã‚’æ„味ã—㦠ã„ã¾ã™. ã¤ã¾ã‚Š, [size|sizeé•·ã®æ–‡å­—列] ã¨ã„ã†ãƒ—ロトコルをæ„味ã—ã¦ã„ã¾ã™. "na$1" ã‹ã‚‰ 次ã®ã‚ˆã†ãª rubyé–¢æ•°ã®æ–‡å­—列を生æˆã—ã¾ã™. def self.get v1, = read(2).unpack(n) v2, = read(v1).unpack("a#{v1}") [v1, v2] end ã§, ã“れを evalã—㦠実際ã«ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã—ã¦ã„ã¾ã™. ã“ã®ä¾‹ã¯evalを用 ãŸã‹ãªã‚Šå‹•çš„ãªãƒ¡ã‚½ãƒƒãƒ‰å®šç¾©ã®ä¾‹ã«ãªã£ã¦ã„ã¾ã™. ã¨ã“ã“ã¾ã§ã‹ã„ã¦ã„ã¦æ°—ã¥ãã¾ã—ãŸãŒ... æ–°ã—ã„eval()ã§ã¯, 特異メソッドã®å®šç¾©ã¯ã§ããªããªã‚‹ãªã‚“ã¦ã“ã¨ã¯ãªã„ã§ã™ よã­?? ã¤ã¾ã‚Š: class Foo def foo eval "def self.bar ... end" end end f = Foo.new f.foo ã¨å®Ÿè¡Œã™ã‚‹ã¨, f.bar() ã¯ã¡ã‚ƒã‚“ã¨å®šç¾©ã•れã¾ã™ã§ã—ょã†ã‹?? evalã®ä¸­ã§ã¯åå‰ç©ºé–“ãŒå¤‰ã‚ã£ã¦ã„ã‚‹ã ã‘ã§å¤‰æ•°ã®ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯å¤‰æ›´ãŒãª ã„ã®ã§å•題ãªã„ã®ã‹ãªã‚?? __ .....................................石塚 圭樹@SHLジャパン(æ ª)... ------------->アドレス変ã‚りã¾ã—ãŸ!! e-mail: keiju@shljapan.co.jp <----