try
method是核心Ruby的常見擴展。例如,它在Rails中默認可用。 try
只有當它不是nil
(Ruby的null
)時,纔會在對象上執行一個方法或一段代碼。它的用法有三種形式:Scala等效於Ruby中的ActiveSupport的Object.try
調用非
nil
對象的方法,並返回結果:
customer_or_nil.try(:save)
。鏈接的代碼的任意塊中的表達式如果結果到目前爲止不
nil
:
obj.try { |non_nil_obj| do_something(non_nil_obj) }
。(2)使用不用於可選的處理,但作爲一種方法來繼續鏈狀表達式,其中在步驟n + 1個的方法要求必須根據步驟n的結果而計算出的參數的擴展:
data.analyze.try { |result| result.compress(optimal_settings(result)) }.save
我在Scala的當量(3)或可替換的Scala成語的,將允許特別感興趣,例如,與此相關的代碼的Apache火花的DataFrame
:
val df = ctx.sql("select * from my_table")
df.
repartition(max(1, df.rdd.partitions.size/4)).
saveAsTable("repartitioned_table")
被重構到類似如下(使用Ruby語法)
ctx.
sql("select * from my_table").
try { |df| df.repartition(max(1, df.rdd.partitions.size/4)) }.
saveAsTable("repartitioned_table")
重構的目標是通過維持一個單一的方法鏈以提高可讀性和通過保持df
限定範圍在步驟減少範圍污染它絕對需要的鏈條。
注:我特別不感興趣的優點和使用Option
可選處理的利弊討論,因爲這不是try
這個問題涉及的主要用例。
一種-理解應該做的工作。 Scala中的'Try'是一個monad,意味着'flatmap()'被定義在它上面。 ''flatmap()'在'Try'上工作的方式是將其參數應用於成功的路徑。 '爲{df < - ctx.sql(...); rep < - repartiion(...); sat < - saveAsTable(...); }' –
@BobDalgleish你錯過了這個問題的目的:我正在尋找一個支持方法鏈接的答案。看看Alexey的回答。 – Sim