Saya mencoba menghindari konstruksi seperti ini:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Oke, dalam contoh ini, cabang then
dan else
sederhana, tetapi Anda dapat menggambar yang kompleks. Saya membuat yang berikut ini:
object TernaryOp {
class Ternary[T](t: T) {
def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
}
class Branch[T](branch: T => Boolean) {
def ?[R] (then: T => R) = new BranchThen(branch,then)
}
class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
class Elze[T,R](elze: T => R) {
def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
}
class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
implicit def any2Ternary[T](t: T) = new Ternary(t)
implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}
Mendefinisikan itu, saya dapat mengganti contoh sederhana di atas dengan:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Tapi bagaimana saya bisa menyingkirkan s: String =>
? Saya ingin sesuatu seperti itu:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Saya kira kompiler membutuhkan barang ekstra untuk menyimpulkan tipe.
HasIs
,IsWithCondition
,ConditionAndTrueCase
kelas yang akan membangun bagian dari ekspresi dari kiri ke kanan.)?
sebelum karakter alfanum lainnya sebagai nama metode karakter pertama dan:
untuk asosiasi kiri. Jadi saya harus memikirkan kembali nama metode baru agar inferensi tipe bekerja dari kiri ke kanan. Terima kasih!Jawaban:
Kita dapat menggabungkan Bagaimana cara mendefinisikan operator terner di Scala yang mempertahankan token terkemuka? dengan jawaban untuk Apakah Opsi membungkus nilai pola yang baik? mendapatkan
Apakah ini cukup untuk kebutuhan Anda?
sumber
val
untuk pernyataan berikutif
: Lakukan dengan jelas dalam satu baris, seperti yang ada dalam pikiran.Dari Blog Lambda Tony Morris :
sumber
then
danelse
.if(c) p else q
pendekatan ... kurangnya kawat gigi membuat saya sedikit tidak nyaman tetapi itu hanya gayaJawaban Rex Kerr diekspresikan dalam Scala dasar:
meskipun saya tidak yakin bagian mana dari konstruksi if – else yang ingin Anda optimalkan.
sumber
if then else
idiom terner satu baris , tetapi ini memang cara yang dapat dipahami untuk menyelesaikannya.Karena konstruksi if-else di Scala mengembalikan nilai, Anda dapat menggunakan ini
Info lebih lanjut: https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples
sumber
Karena: dengan sendirinya tidak akan menjadi operator yang valid kecuali Anda baik-baik saja dengan selalu meloloskannya dengan tanda centang belakang
:
, Anda dapat menggunakan karakter lain, misalnya "|" seperti di salah satu jawaban di atas. Tapi bagaimana dengan elvis dengan jenggot? ::Tentu saja ini lagi tidak akan berfungsi jika nilai Anda adalah daftar, karena mereka memiliki :: operator sendiri.
sumber