亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

詳解Ruby中的instance_eval方法及其與class_eval的對比

2020-10-29 19:35:31
字體:
來源:轉載
供稿:網友

instance_eval方法

這個BasicObject#instance_eval有點類似JS中的bind方法,不同的時,bind是將this傳入到對象中,而instance_eval則是將代碼塊(上下文探針Context Probe)傳入到指定的對象中,一個是傳對象,一個是傳執行體。通過這種方式就可以在instance_eval中的代碼塊里訪問到調用者對象中的變量。

示例代碼

class MyClass  def initialize    @v = 1  endendobj = MyClass.newobj.instance_eval do  self  #=> #<MyClass:0x33333 @v=1>  @v   #=> 1 endv = 2obj.instance_eval { @v = v }obj.instance_eval { @v }  # => 2

此外,instance_eval方法還有一個雙胞胎兄弟:instance_exec方法。相比前者后者更加靈活,允許對代碼塊傳入參數。

示例代碼

class C  def initialize    @x = 1  endendclass D  def twisted_method    @y = 2    #C.new.instance_eval { “@x: #{@x}, @y>: #{y}” }    C.new.instance_exec(@y) { |y| “@x: #{@x}, @y: #{y}” }  endend#D.new.twisted_method  # => “@x: 1, @y: ”D.new.twisted_method  # => “@x: 1, @y: 2”

因為調用instance_eval后,將調用者作為了當前的self,所以作用域更換到了class C中,之前的作用域就不生效了。這時如果還想訪問到之前@y變量,就需要通過參數打包上@y一起隨instance_eval轉義,但因為instance_eval不能攜帶參數,所以使用其同胞兄弟instance_exec方法。


instance_eval 與 class_eval 的區別
###instance_eval
首先從名字可以得到的信息是,instance_eval的調用者receiver必須是一個實例instance,而在instance_eval block的內部,self即為receiver實例本身。

obj_instance.instance_eval do self # => obj_instance # current class => obj_instance's singleton classend<!--more-->

根據這個定義,如果在一個實例上調用了instance_eval,就可以在其中定義該實例的單態函數 singleton_method

class Aenda = A.newa.instance_eval do self # => a # current class => a's singleton class def method1  puts 'this is a singleton method of instance a' endenda.method1#=> this is a singleton method of instance ab = A.newb.method1#=>NoMethodError: undefined method `method1' for #<A:0x10043ff70>

同樣,因為類class本身也是Class類的一個實例,instance_eval也可以用在類上,這個時候就可以在其中定義該類的singleton_method,即為該類的類函數。

換句話說,可以用instance_eval來定義類函數class method,這比較容易混淆,需要搞清楚。

class AendA.instance_eval do self # => A # current class => A's singleton class def method1  puts 'this is a singleton method of class A' endendA.method1#=> this is a singleton method of class Aclass_eval

###class_eval

再來看class_eval,首先從名字可以得到的信息是,class_eval的調用者receiver必須是一個類,而在class_eval block的內部,self即為receiver類本身。

class AendA.class_eval do self # => A # current class => Aend

根據這個定義,如果在一個類上調用了class_eval,就可以在其中定義該類的實例函數 instance_method

class Aenda = A.newa.method1#=> NoMethodError: undefined method `method1' for #<A:0x10043ff70>A.class_eval do self # => A # current class => A def method1  puts 'this is a instance method of class A' endenda.method1#=> this is a instance method of class A

換句話說,可以用class_eval來定義實例函數instance method,這也比較容易混淆,需要搞清楚。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜精品视频| 欧美尤物巨大精品爽| 在线看国产精品| 黄色一区二区三区| 97久久久免费福利网址| 97精品视频在线播放| 久久精品欧美视频| 久久精品夜夜夜夜夜久久| 精品女同一区二区三区在线播放| 国产亚洲欧洲黄色| 欧美在线激情网| 97色在线视频观看| 日韩av在线网页| 日本精品在线视频| 91精品免费看| 精品激情国产视频| 欧美激情一级欧美精品| 夜夜躁日日躁狠狠久久88av| 神马久久桃色视频| 久久99久久久久久久噜噜| 国产91精品在线播放| 精品国产欧美成人夜夜嗨| 久久97久久97精品免视看| 91av在线播放视频| 免费99精品国产自在在线| 国产最新精品视频| 久久久久北条麻妃免费看| 精品久久久久久久久久久久久久| 中文字幕一区二区三区电影| 亚洲a级在线观看| 日本精品中文字幕| 国产有码一区二区| 国产久一一精品| 欧美精品一区二区三区国产精品| 国产精品成人一区| 91久久精品国产91久久性色| 国产a∨精品一区二区三区不卡| 国产精品99久久久久久久久| 日韩欧美高清在线视频| 久久久噜久噜久久综合| 欧美激情在线一区| 国产精品久久久久久五月尺| 国产精品伦子伦免费视频| 欧美尤物巨大精品爽| 亚洲级视频在线观看免费1级| 中文字幕在线亚洲| 国产视频一区在线| 亚洲美女免费精品视频在线观看| 中日韩午夜理伦电影免费| 精品欧美国产一区二区三区| 亚洲精品国产精品久久清纯直播| 亚洲激情中文字幕| 成人黄色大片在线免费观看| 九九精品在线视频| 精品久久久久久亚洲精品| 成人xvideos免费视频| 日韩精品高清视频| 国产精品一区二区女厕厕| 亚洲电影免费在线观看| 久久久久久久电影一区| 欧美日韩在线观看视频小说| 深夜福利一区二区| 欧美精品中文字幕一区| 国内精久久久久久久久久人| 97香蕉超级碰碰久久免费的优势| 国产在线视频欧美| 九九精品在线观看| 久久久久久久亚洲精品| 日韩在线激情视频| 国产精品精品视频| 国产精品在线看| 91色视频在线导航| 久久久久久噜噜噜久久久精品| 日韩av大片免费看| 视频在线观看一区二区| 91九色在线视频| 亚洲成色777777女色窝| 国产精品高潮呻吟久久av无限| 黄色91在线观看| 国产精品大片wwwwww| 91免费精品国偷自产在线| 成人性生交大片免费看视频直播| 精品五月天久久| 亚洲精品在线视频| 国产一区二区黑人欧美xxxx| 91福利视频网| 国产精品第一区| 精品久久久久久久久国产字幕| 国产精品老牛影院在线观看| www.亚洲一二| 国产精品久久久久久久久久东京| 亚洲欧美日韩精品久久亚洲区| 高清一区二区三区日本久| 欧美日韩一二三四五区| 91九色国产社区在线观看| 久久人人97超碰精品888| 日韩欧美视频一区二区三区| 国产精品网站视频| 91亚洲精品在线| 亚洲一区二区三区视频播放| 国产噜噜噜噜噜久久久久久久久| 91精品国产综合久久香蕉| 亚洲无亚洲人成网站77777| 日韩欧美亚洲综合| 亚洲综合最新在线| 国外成人在线直播| 久久久久久久电影一区| 自拍偷拍免费精品| 中文字幕亚洲情99在线| 欧美电影在线观看高清| 久久男人av资源网站| 久久成人亚洲精品| 日韩美女在线观看| 红桃av永久久久| 久久久噜噜噜久久久| 久久久久久久久国产| 亚洲男人天堂手机在线| 欧美性猛交丰臀xxxxx网站| 狠狠躁18三区二区一区| 欧美精品videos性欧美| 91精品国产综合久久久久久久久| 国产精品18久久久久久首页狼| 欧美性在线观看| 97色在线观看| 欧美人在线视频| 日韩免费电影在线观看| 日韩a**站在线观看| 欧美精品videos| 久久精品99久久久香蕉| 国产成人精品免费视频| 国产精品爱久久久久久久| 国产精品自拍视频| 亚洲视频在线观看视频| 亚洲网站视频福利| 国产在线999| 久久精品国产精品| 按摩亚洲人久久| 91精品国产91久久久久久| 日本久久91av| 欧日韩不卡在线视频| 粉嫩av一区二区三区免费野| 国产精品久久久久福利| 欧美极品少妇xxxxx| 日韩电影中文字幕一区| 97视频免费观看| 日韩三级成人av网| 精品欧美一区二区三区| 欧美性高跟鞋xxxxhd| 国产精品91免费在线| 中文字幕国产亚洲2019| 欧美精品videos另类日本| 精品呦交小u女在线| 亚洲精品在线不卡| 美女扒开尿口让男人操亚洲视频网站| 欧美大片在线看免费观看| 欧美三级免费观看| 亚洲欧美日韩精品久久亚洲区| 揄拍成人国产精品视频| 中文字幕精品—区二区| 欧美一级大片视频| 欧美性猛交xxxx| 欧美成人激情视频| 亚洲美女中文字幕| 亚洲精品视频二区|