2010-04-13 66 views
31

Tôi mới sử dụng scala và tôi thấy cần phải chuyển đổi giá trị boolean thành số nguyên. Tôi biết tôi có thể sử dụng giống như if (x) 1 else 0 nhưng tôi muốn biết nếu có một phương pháp ưa thích, hoặc một cái gì đó được xây dựng vào khuôn khổ (tức toInt())Có cách nào dễ dàng để chuyển đổi một Boolean thành một số nguyên không?

+3

Tôi nghĩ rằng nếu có một phương pháp trong khuôn khổ, nó sẽ làm điều gì đó giống như để 'nếu (x) 1 else 0', theo truyền thống C là 0 cho false và 1 cho true. –

+1

tôi vừa nhận ra sai lầm của mình và chỉnh sửa bài đăng. –

+0

Nếu không có nhiều bối cảnh, tôi sẽ nói rằng nó không thực sự là một thực hành tốt. Booleans không phải là số nguyên, tôi sẽ không chuyển đổi hoàn toàn từ cái này sang cái khác ... Tôi sẽ giữ cho sự chuyển đổi rõ ràng, nếu không nó có thể dễ dàng bị lẫn lộn. Phương châm cho các tính năng cao cấp của Scala là: "với sức mạnh to lớn có trách nhiệm lớn" :) – GClaramunt

Trả lời

36

Nếu bạn muốn kết hợp BooleanInt hoạt động sử dụng một implicit như trên nhưng mà không cần tạo một lớp:

implicit def bool2int(b:Boolean) = if (b) 1 else 0 

scala> false:Int 
res4: Int = 0 

scala> true:Int 
res5: Int = 1 

scala> val b=true 
b: Boolean = true 


scala> 2*b+1 
res2: Int = 3 
+0

lợi thế của việc sử dụng ngầm định không có lớp học là gì? –

+1

@Russ Bradberry, Nếu bạn thử câu trả lời từ @Jackson Davis, bạn phải gọi một cách rõ ràng hàm asInt để thực hiện chuyển đổi để làm ==> val a: Int = true là không thể, và do đó làm ==> (1- thật). Chuyển đổi không minh bạch. – Patrick

+0

do đó, điều này làm cho nó toàn cầu? hay tôi cần phải làm một cái gì đó đặc biệt để làm cho toàn cầu này? cũng, điều này sẽ làm việc như một cái gì đó như nếu tôi chèn vào mysql '" chèn vào blah (boolVal) giá trị ("+ b +") "', nó sẽ tự động giả định phiên bản int của nó và không phải là phiên bản bool? –

14

Bạn có thể làm điều này một cách dễ dàng với các chuyển đổi ngầm:

class asInt(b: Boolean) { 
    def toInt = if(b) 1 else 0 
} 

implicit def convertBooleanToInt(b: Boolean) = new asInt(b) 

Sau đó, bạn sẽ nhận được một cái gì đó giống như

scala> false toInt 
res1: Int = 0 
+3

Quy ước thư viện là sử dụng 'toInt' - điều tương tự sẽ là một ý tưởng hay ở đây. –

+0

đủ công bằng, được chỉnh sửa để phản ánh điều đó. –

+4

Kỹ thuật tuyệt vời này được gọi là "pimp my library". –

5

Thực ra, tôi mong đợi nó là if (x) 1 else 0, không phải if (x) 0 else 1.

Đó là lý do tại sao bạn nên viết chuyển đổi của riêng mình. Integer không phải là một boolean, và nếu bạn muốn vì lý do nào đó để lưu trữ các boolean như các số nguyên, thì bạn nên trau dồi các tiêu chuẩn của riêng mình về sự thật và sự thật không được biểu diễn như thế nào.

Boolean "true" không phải là số, nó là một thể hiện của kiểu Boolean. Giống như java.lang.Boolean.TRUE. Nó có thể được lưu trữ bên trong như một số nguyên, nhưng đó là một chi tiết thực hiện không nên bị rò rỉ vào ngôn ngữ.

Tôi muốn nói rằng if (x) 0 else 1 là phương pháp chuyển đổi ưu tiên. Nó rất đơn giản và nhanh chóng.

Bạn cũng có thể viết x match {case true => 0; case false => 1} nếu bạn muốn sử dụng phương pháp so khớp mẫu chung hơn.

+0

cũng ý tưởng là chuyển đổi nó thành c chuẩn 0 = false, 1 = true. Nhưng tại sao tôi sẽ sử dụng trận đấu thay vì ternary nếu khác? –

9

Trong khi sử dụng một implicit có lẽ là cách tốt nhất để đi, nếu bạn muốn chuyển đổi nhanh chóng-và-bẩn từ boolean để int bạn có thể sử dụng boolean.compare(false)

3

Kể từ Scala 2.10 là giải pháp của Jackson Davis được thường xuyên hơn bằng văn bản sử dụng an implicitvalue lớp:

implicit class BoolToInt(val b:Boolean) extends AnyVal { 
    def toInt = if (b) 1 else 0 
    def * (x:Int) = if (b) x else 0 
} 

đối thoải mái thêm tôi cũng đã thêm một nhà điều hành nhân, vì đây là việc sử dụng phổ biến nhất của một Boolean để Int chuyển đổi cho tôi. Tôi thích điều này hơn làm cho việc chuyển đổi chính nó ngầm (giải pháp được cung cấp bởi Patrick), vì mất nhiều điều khiển kiểu hơn tôi muốn.

3

Nếu bạn không muốn đi theo con đường ngầm, điều này có thể hữu ích:

var myBool:Boolean = true 
myBool: Boolean = true 

myBool.compare(false) 
res3: Int = 1 

myBool = false 
myBool: Boolean = false 

myBool.compare(false) 
res3: Int = 0 
+0

Tôi cũng nghĩ như vậy trước, nhưng hợp đồng so sánh chỉ hứa hẹn một số dương cho true.compare (false). Vì vậy, nó có thể là một JVM thực hiện trả về sth lớn hơn 1. –

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