2017-02-04 3 views
1

私は、呼び出しの1つをデフォルト値に追加する必要があるBuilder呼び出しチェーンを持っています。メソッド呼び出しチェーンで連鎖オブジェクトを参照することはできますか?

var x = new X() 
    .setA(1) 
    .setB(2) 
x = x.setList(x.getList :+ "itemtoappend") 

setList呼び出しをインライン化する方法はありますか? 、キーワードも言っている私は願ってい

(Xは、サードパーティのライブラリである)このように使用される「チェーン」、:

val x = new X() 
    .setA(1) 
    .setB(2) 
    .setList(chain.getList :+ "itemtoappend") 

私は書く能力を持っていないと仮定すると、 X上のappendToListメソッドであり、appendToListを持つMyXクラスへの書き込みおよび暗黙的な変換はしたくありません。

+0

実際の使用例Spark ML StopWordsRemoverにいくつかの新しい単語を追加し、既存の列の関数として新しい列をSpark DataFrameに追加することを含めることを望みます。 – barclar

答えて

1

あなたはそれを構築しているときに同時にオブジェクトに2回アクセスしたいと思うようです。

class X { 
    def setA(a: Int): X = this 
    def setB(b: Int): X = this 
    def setList(ss: Seq[String]): X = this 
    def getList = Seq("head") 
} 

val x: X = Option(new X().setA(1).setB(2) 
       ).map(z => z.setList(z.getList :+ "itemtoappend")).get 
+0

これは、xが不変であるようにすべてをインライン化します。このコードの意図は私にはすぐわかりませんでした。それは共通のパターンですか? – barclar

+0

あなたがそれを気に入ってうれしいです。 (おそらく、それを受け入れられた答えとしてマークすることはできますか?)いいえ、私はこれが共通のパターンではないと思います。無名関数に渡されるパラメータは、構築されるオブジェクトの中間表現であることに気付きました。私は 'map()'メソッドを提供するラッパーを作成/破棄するために 'Option()。get'を使用しました。 – jwvh

+0

私は同意しました、ありがとうございます。私は他の提案があるかどうかを見て待っていましたが、今後の予定はありません。私はこのオプションをOptionの代わりにSomeを使って少し使っています: 'Some(new X()。setA(1).setB(2))。map(z => z.setList(z.getList:+" itemtoappend "))。get' – barclar

0

私は標準的なアプローチは、設定と取得の両方を行い、関数を渡す方法を書いていると思います。

val x = new X() 
    .setA(1) 
    .setB(2) 
    .list(_ :+ "itemtoappend") 
+0

ありがとうございます。それは確かに私のappendToListアイデアよりも一般的ですが、私はまだMyXを発明して暗黙的に変換する必要があると思いますか? – barclar

+0

あ、そうです、あなたは 'X'を実装する方法を尋ねていましたが、与えられた' X'を使ってチェーンを書きたいとは思いませんでした。ええ、 'MyX'への暗黙的な変換、' var x'での書き出し、 'X'作者による機能要求のファイリングのいずれかがオプションです。 – Bergi

関連する問題