Rails參數binding概念講解
在Ruby on Rails開發框架被我們用來實現簡單的代碼編寫。在Ruby中,有許多參數值得我們去深入探討。比如本文介紹Rails參數binding的相關內容。#t#
eval方法有一個可選的參數--binding,如果為指定的話,那么表達式的值就會是一個具體的范圍或上下文環境綁定。不過不必為這個有所意外,Rails參數binding會返回一個Binding對象的實例,可以使用binding方法返回綁定的值。下是是ruby文檔中提供的一個示例:
- def getBinding(str)
- return binding()
- end
- str = "hello"
- puts( eval( "str + ' Fred'" ) )
#=> "hello Fred" - puts( eval( "str + ' Fred'",
getBinding("bye") ) ) #=> "bye Fred" - def getBinding(str) return binding()
end str = "hello" puts( eval( "str + '
Fred'" ) ) #=> "hello Fred" puts
( eval( "str + ' Fred'", getBinding
("bye") ) ) #=> "bye Fred"
Rails參數binding是內核的一個私有方法。getBinding方法通過調用binding方法返回當前上下文環境中str的值。在***次調用 eval方 法的時候,當前上下文環境是main對象,并且str的值就是定義的局部變量str的值。
在第二次調用eval方法是,當前的上下文環境則是 getBinding方法內部,局部變量str的值現在則為getBinding方法中參數str的值。Binding方法經常作為eval的第二個參 數,這樣eval就不會因為找不到變量而出錯了。
上下文環境也可以在類中定義。在下面的例子中,可以看到,實例變量@mystr和類變量@@x根據類而不同:
- class MyClass
- @@x = " x"
- def initialize(s)
- @mystr = s
- end
- def getBinding
- return binding()
- end
- end
- class MyOtherClass
- @@x = " y"
- def initialize(s)
- @mystr = s
- end
- def getBinding
- return binding()
- end
- end
- @mystr = self.inspect
- @@x = " some other value"
- ob1 = MyClass.new("ob1 string")
- ob2 = MyClass.new("ob2 string")
- ob3 = MyOtherClass.new("ob3 string")
- puts(eval("@mystr << @@x",
ob1.getBinding)) #=> ob1 string x- puts(eval("@mystr << @@x",
ob2.getBinding)) #=> ob2 string x- puts(eval("@mystr << @@x",
ob3.getBinding)) #=> ob3 string y- puts(eval("@mystr << @@x",
binding)) #=> main some other value
Rails參數binding的概念就為大家介紹到這里了。