2012-02-20 29 views
10

Tôi có thể sử dụng nhiều thông số trong các bộ định vị không?Cài đặt Scala - nhiều thông số

Ví dụ:

private var _a = 0 
def a = _a 
def a_= (b: Int, c: Int) = _a = b + c 

Nếu có, làm thế nào tôi có thể gọi phương thức setter?

+0

Tuples là tốt. Cũng nên xem xét sử dụng phương thức 'update()', ví dụ: 'def update (p1: T1, p2: T2, p3: T3, v: V)' thì bạn có thể viết 'obj (p1, p2, p3) = v' – tuxSlayer

+0

Và có, bạn vẫn có thể gọi nó là' obj.a_ = (1, 2) 'nhưng có lẽ nó không phải là 'setter';) – tuxSlayer

Trả lời

9

Còn một bộ tuple thì sao?

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    _a = t._1 + t._2 
    } 
} 

Nếu bạn không thích vụng về cú pháp truy cập tuple:

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    t match { 
     case(b, c) => _a = b + c 
    } 
    } 
} 

Cách sử dụng:

val x = new A() 
x.a = (3, 7) 
x.a //10 
+0

Ví dụ về cách thức này được gọi là? (Tôi chưa bao giờ có thể làm việc này một cách độc đáo ... ít nhất là trong [cũ] 2.8.) –

+0

@pst: thêm một ví dụ, dường như hoạt động (?) –

+0

Hoan hô cho tiến trình :) –

1

Nếu bạn cần phải thiết lập giá trị duy nhất từ ​​hai giá trị khác, nó có lẽ không phải là một 'setter'. Hãy xem xét cho hoạt động này một tên có ý nghĩa hoặc di chuyển nó ra khỏi lớp này.

private var _s: Whatever = // init 
def s_=(newValue: Whatever): Unit = _setter = newValue 
... 
implicit def t2whatever(t: (SomeTypeA, SomeTypeB)): Whatever = // some logic here 

bây giờ chúng tôi Cal gọi setter của chúng tôi

obj.setter = sta -> stb 
// or 
obj.setter = (sta, stb) 

Mà là nhiều hơn hoặc ít hơn giống như với các bộ đồng bằng Tuy nhiên, ngữ nghĩa setter là không đọc sai.

Trong trường hợp hoạt động nội bộ của mình trong thể trông giống như:

class Z { 
    private var _s = // init 

    def s = _s 
    def s_=(newValue: S) = _s = newValue 
} 

object Z { 
    def toS(a: S, b: S): S = ChineseZodiac.choose(0.14 * a, math.PI + b) 
} 

và sau đó

obj.s = Z.toS(1, 2) 
+0

Cảm ơn. Tôi hiểu rằng ngữ nghĩa setter có thể được thay đổi, nhưng đôi khi tôi sử dụng setter đó trong một đoạn mã nhỏ, và dường như sẽ dễ dàng hơn nếu tôi không chia mã đó thành một đối tượng hay lớp khác ... –

Các vấn đề liên quan