Ruby Block/Procedure/Lambdas/Method/Symbol

參考文檔

Block 和 Procedure

這個在上一篇文章中已經記錄,Block其實就是Procedure,只是沒有變量指向它不可複用。react

def show_type(&obj)
  puts obj.class
end

show_type {}

# => Proc

Lambdas

Ruby經過如下方式支持lambda方式:ruby

def lambda_call(lam)
  lam.call
end

lambda_call lambda{puts "lambda"}

Method

Ruby 還能夠直接調用method對象:code

def generic_return(block)
  block.call
end

def method_demo
  puts "method"
end

generic_return method(:method_demo)

# =》 method

Block、Proc和Lambda、Method的區別

Lambda和Method的執行是方法棧的調用,而Block或Proc實際行爲是相似於遷入代碼中的一個代碼塊,以下:對象

def generic_return(block)
  block.call
  puts "end"
end

def method_demo
  puts "method"
end

generic_return method(:method_demo)
generic_return lambda{puts "lambda"; return nil}
generic_return Proc.new {return "Proc.new"}

# => method
# => end
# => lambda
# => end
# => unexpected return (LocalJumpError) 報錯了

Symbol 和 String

symbol和String有不少類似之處,二者之間能夠方便的轉換:ip

:symbol.to_s	
"symbol".intern

# => "symbol"
# => :symbol

使用symbol的緣由存在如下幾點:內存

  • String是可變的,除非你使用freeze方法凍結(凍結操做是不可逆的),並且Ruby中String也是傳遞對象而非複製,由此可能形成難察覺的bug。
  • 內存使用效率,若是經過var="string"的方式建立字符串,每次建立都會分配新的內存空間;而Symbol因爲其不變性,只有首次建立的時候會建立惟一對象。
  • 比較效率,若是是字符串的比較則須要比較其內容==,而Symbol只有惟一對象直接比較內存地址便可。

另外能夠經過Symbol.all_symbols方法得到當前所有的symbol。文檔

相關文章
相關標籤/搜索