【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
参考文档
Block 和 Procedure
这个在上一篇文章中已经记录,Block其实就是Procedure,只是没有变量指向它不可复用。
def show_type(&obj)
puts obj.class
end
show_type {}
# => Proc
Lambdas
Ruby通过以下方式支持lambda方式:
def lambda_call(lam)
lam.call
end
lambda_call lambda{puts "lambda"}
Method
Ruby 还可以直接调用method对象:
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有很多相似之处,两者之间可以方便的转换:
:symbol.to_s
"symbol".intern
# => "symbol"
# => :symbol
使用symbol的原因存在以下几点:
- String是可变的,除非你使用freeze方法冻结(冻结操作是不可逆的),而且Ruby中String也是传递对象而非复制,由此可能造成难察觉的bug。
- 内存使用效率,如果通过var="string"的方式创建字符串,每次创建都会分配新的内存空间;而Symbol由于其不变性,只有首次创建的时候会创建唯一对象。
- 比较效率,如果是字符串的比较则需要比较其内容==,而Symbol只有唯一对象直接比较内存地址即可。
另外可以通过Symbol.all_symbols方法获得当前全部的symbol。
来源:oschina
链接:https://my.oschina.net/u/870846/blog/597927