-
ruby 的命名規(guī)則
局部變量:以英文字母或者_(dá)開頭,如:name = "this is a local variable"
全局變量:以
$
開頭烈菌,如:$name = "this is a global variable"
實例變量:以
@
開頭阵幸,如:@name = 'lily'
類變量:以
@@
開頭,如:@@name = 'lily'
常量:全大寫字母芽世,如:
NAME
類名和模塊名:以首字母大寫挚赊,駝峰命名法。如:
HelloWorld
方法名:小寫用_隔開济瓢,如:
sort_by_name
-
ruby 中 singleton class 和 singleton method 分別是什么
Singleton method
A method which belongs to a single object rather than to an entire class and other objects.
一個方法只屬于一個對象荠割,而不是整個類和其他實例化對象。firstObj = ClassMethods.new secondObj = ClassMethods.new def firstObj.singletonMethod "Hi am a singlton method available only for firstObj" end firstObj.singletonMethod # "Hi am a singlton method available only for firstObj" secondObj.singletonMethod #undefined method `singletonMethod' for #<ClassMethods:0x32754d8> (NoMethodError)
So this “singletonMethod” belongs only to the firstObj object and won’t be available for other objects of this class.
If you try to make the secondObj.singletonMethod Ruby will inform you that singletonMethod is an undefined method.所以旺矾,
singletonMethod
只屬于firstObj
,不能被這個類的其他實例化對象所調(diào)用蔑鹦。如果你想用secondObj.singletonMethod
調(diào)用這個單例方法,ruby 會告訴你singletonMethod
沒有定義If you like to find all the singleton methods for a specific object, you can say objectname.singleton_methods
In our case
如果你想找到一個特定對象的所有單例方法箕宙,你可以用 objectname.singleton_methods 嚎朽。在我們的例子里面就是:firstObj.singleton_methods => ["singletonMethod"] secondObj.singleton_methods => []
To avoid throwing undefined method error when you try to access a singleton method with some other object
避免調(diào)用單例方法****拋出方法未定義的異常:
if secondObj.singleton_methods.include?("singletonMethod") secondObj.singletonMethod end # 或 if secondObj.singleton_methods.include?( :singletonMethod ) secondObj.singletonMethod end
Singleton classes
單例類A singleton class is a class which defines a single object.
單例類就是只有一個實例對象的類。In our above example we have two objects firstObj and secondObj.
We can create a separate class for the secondObj instance and that is called as a singleton class.
So as per the definition we created a class for a single object.在我們上面的例子里面柬帕,我們有兩個對象哟忍,firstObj 和 secondObj。我們給 secondObj 實例 創(chuàng)建一個單獨的類陷寝,這就叫做單例類锅很。
所以按照定義為一個單獨的對象我們創(chuàng)建了一個類。class << secondObj def method4 p "Hi am a singlton method available only for secondObj" end end
When you see a class definition with the class keyword followed by two less than symbols that is a Singleton class opened for the object.
In our ClassMethods class we had something like class << self which is also a singleton class. In Ruby a class itself is an instance of the Ruby class Let's try something like this當(dāng)你看到定義一個類后面跟著
<<
的時候凤跑,這就是打開這個對象的單例類爆安。
在我們的ClassMethods
這個類中,我們有class << self
仔引,所以這也是一個單例類鹏控。在 ruby 里,一個類本身也是一個 ruby 的類肤寝。讓我們試試ClassMethods.class # Class
-
怎么寫一個 module当辐,可以讓包含這個 module 的 class 既能使用這個 module 的類方法又能使用這個 module 的實例方法
參考 http://motion-express.com/blog/include-instance-&-class-methods-from-a-modulemodule Foo def self.included(m) def m.show1 p "hi" end end def show2 p "hello" end end class Bar include Foo end Bar.new.show2 #=> "hello" Bar.show1 #=> "hi" Bar.show2 #=> NoMethodError: undefined method `show2' for Bar:Class Bar.new.show1 #=> NoMethodError: undefined method `show1' for #<Bar:0x007fa1fb8c2ce8>
或
module A def b puts "method b from module A" end def c puts "method c from module A" end end class B include A extend A end B.new.b # => "method b from module A" B.b # => "method b from module A" B.new.c # => "method c from module A" B.c # => "method c from module A"
-
require load auto_load 以及 require_dependency 的區(qū)別
require,load用于文件鲤看,如.rb等等結(jié)尾的文件缘揪。
include則用于包含一個文件(.rb等結(jié)尾的文件)中的模塊。
require一般情況下用于加載庫文件,而load則用于加載配置文件找筝。
require加載一次蹈垢,load可加載多次。詳細(xì)參考: 淺談Ruby中的類加載機制
Require/load/autoload的區(qū)別和用法
描述 object, class, module 的關(guān)系是什么袖裕,并畫圖表示曹抬。
從繼承關(guān)系來說,是Class --> Module --> Object急鳄,即Object是繼承樹的頂層谤民,緊接著是Module,然后是Class疾宏。
Modules, Classes, and Objects-
為什么在 model 中可以調(diào)用 validates张足,自己怎么實現(xiàn) model 中的 validates,試著實現(xiàn)一下坎藐?
-
ruby 中 ? 或者 ! 作為后綴的方法有什么不同为牍?
It's "just sugarcoating" for readability, but they do have common meanings:Methods ending in ! perform some permanent or potentially dangerous change; for example:
Enumerable#sort returns a sorted version of the object while Enumerable#sort! sorts it in place.
In Rails, ActiveRecord::Base#save returns false if saving failed, while ActiveRecord::Base#save! raises an exception.
Kernel::exit causes a script to exit, while Kernel::exit! does so immediately, bypassing any exit handlers.
Methods ending in ? return a boolean, which makes the code flow even more intuitively like a sentence — if number.zero? reads like "if the number is zero", but if number.zero just looks weird.在Ruby中,以問號(?)結(jié)尾岩馍,被用于標(biāo)示謂詞碉咆,即返回Boolean值的方法,如Array.empty?(判斷數(shù)組中元素是否為空)蛀恩。
而通常情況下吟逝,不帶感嘆號的方法返調(diào)用該方法的一個拷貝,帶感嘆號的方法則是一個可變方法赦肋,該方法會修改原來的對象,如Array類中的sort和sort! rails 源碼
rails 本身是由什么組成的励稳?
Rails組成和項目結(jié)構(gòu)
10.《ruby 元編程》工作中遇到過哪些挑戰(zhàn)和困難佃乘,怎么解決的?
不使用 ActiveJob驹尼,sidekiq 單獨使用可以不趣避?
Active Job 和 Sidekiq 簡介
Active Job
Rails: 使用Active Job來處理異步任務(wù)bundler 和 gem 的關(guān)系?bundler 是 gem 么新翎?
bundler
Rvm 與 Bundler 的愛恨情仇
RVM,RubyGems和Bundler的日常使用passenger, nginx, 還有一個是什么程帕,忘記了,這三個各自干什么的地啰,怎么結(jié)合起來一起工作愁拭,缺一可以不
Ruby 服務(wù)器對比-
each 和 map 的區(qū)別
each: 順序返回各個元素
collect: 把原數(shù)組的各個元素順序返回,并組裝新的數(shù)組
map: 與 collect一樣亏吝,會創(chuàng)建一個新的數(shù)組
select: 與collect一樣岭埠,會創(chuàng)建一個新的數(shù)組Ruby: 聊一聊關(guān)于集合遍歷的各種方法
Pluck vs. map and select$ a = [1,2,3,4] => [1, 2, 3, 4] $ a.each {|n| n*2} => [1, 2, 3, 4] $ a => [1, 2, 3, 4] $ a.map {|n| n*2} => [2, 4, 6, 8] $ a => [1, 2, 3, 4] $ a.collect {|n| n*2} => [2, 4, 6, 8] $ a => [1, 2, 3, 4]
find 和 find_by 的區(qū)別
rails中find/find_by/where的區(qū)別解決 N+1 Query 的方法有哪些
淺談 ActiveRecord 的 N + 1 查詢問題
Rails使用include和join避免N+1 queries單表繼承
Rails 之單表繼承 (Single Table Inheritance)
Inheritance 單表繼承
ActiveRecord-連接多張表之單表繼承rack 是什么
Rails on Rack-
安全問題。怎么破 XSS 和 CSRF攻擊
解法:
對于XSS:首先說說什么是XSS(Cross-site scripting),跨站腳本攻擊惜论,攻擊者在客戶端注入可執(zhí)行代碼许赃。
對策:
過濾惡意輸入非常重要,但是轉(zhuǎn)義 Web 應(yīng)用的輸出同樣也很重要馆类。
過濾惡意輸入白名單比黑名單要有效混聊,特別是在需要顯示未經(jīng)過濾的用戶輸入時(例如前面提到的的搜索表單的例子)。使用 escapeHTML() 方法(或其別名 h() 方法)乾巧,把 HTML 中的字符 &句喜、"、< 和 > 替換為對應(yīng)的轉(zhuǎn)義字符 &卧抗、"藤滥、< 和 >。對于CSRF:Cross Site Request Forgery社裆,跨站請求偽造拙绊。通俗理解:攻擊者盜用當(dāng)前用戶身份,發(fā)請當(dāng)前用戶的惡意請求:如郵件泳秀,銀行轉(zhuǎn)賬等标沪。
對策:首先,根據(jù) W3C 的要求嗜傅,應(yīng)該適當(dāng)?shù)厥褂?GET 和 POST HTTP 方法金句。其次,在非 GET 請求中使用安全令牌(security token)可以防止應(yīng)用受到 CSRF 攻擊吕嘀。
ActiveSupport::Concern 的工作原理
參考 ActiveSupport::Concern
ActiveSupport::Concern 的工作原理-
yield self 的用法违寞,寫個例子
class Builder def initialize arguments # do somthing by init arguments end # you can use Builder's method in block def build yield self if block_given? end end
scope 的實現(xiàn)原理
核心是延遲計算,將where偶房、order趁曼、limit子句變?yōu)镽elation對象,然后在最終調(diào)用each/to_a時組裝sql