2011-07-07 26 views
5

tôi muốn làm một cái gì đó như thế này:Scala: Có thể tham chiếu theo nghĩa đen?

scala> "Hello world"(this.length -1) 
res30: Char = d 

Điều này rõ ràng không hoạt động như tôi không thể tham chiếu "Hello world" mà trước hết không lưu trữ nó như là một val.

Có cách nào để đạt được điều này không?

+2

Bạn đang tìm cách tạo 'd' thay vì 'l'? Xin lỗi, chỉ cần đảm bảo .... –

+0

@Ray, tôi đã sửa lỗi đánh máy. – Rahul

Trả lời

22

Nếu bạn chỉ muốn ký tự cuối cùng của chuỗi, bạn chỉ có thể làm:

scala> "Hello World".last 
res0: Char = d 

Đối với một vấn đề chung, bạn có thể muốn sử dụng các nhà điều hành đường ống về phía trước, như hình dưới đây:

scala> "Hello World" |> { t => t(t.length - 1) } 
res1: Char = d 

Bạn có thể xác định toán tử ống dẫn phía trước như được hiển thị bên dưới hoặc sử dụng toán tử có sẵn trong Scalaz.

scala> implicit def anyWithPipe[A](a: A) = new { 
    | def |>[B](f: A => B): B = f(a) 
    | } 
anyWithPipe: [A](a: A)java.lang.Object{def |>[B](f: (A) => B): B} 
+0

[Scalaz] (http://code.google.com/p/scalaz/) là một thư viện cung cấp "các lớp loại và cấu trúc dữ liệu chức năng thuần túy cho Scala", bao gồm toán tử đường dẫn '|>' forward. [Tài liệu và tải xuống trên Google Code] (http://code.google.com/p/scalaz/), [mã nguồn trên GitHub] (https://github.com/scalaz/scalaz). –

+0

@ RoryO'Kane, nếu bạn nhìn kỹ, bạn sẽ nhận thấy rằng tôi đề cập đến Scalaz trong câu trả lời của tôi. – missingfaktor

+0

Tôi biết. Tôi đã cung cấp liên kết đến và mô tả về Scalaz để những người khác không phải làm như vậy với Google, như tôi phải làm vậy. Tôi lặp lại rằng Scalaz bao gồm '|>' vì lợi ích của skimmers. –

3

Bạn không thể tham chiếu chính nghĩa đen, nhưng bạn có thể tạo khối bằng biến tạm thời cục bộ cho khối đó.

scala> val lastChar = { val tmp = "Hello World"; tmp(tmp.length - 1) } 
lastChar: Char = d 

scala> tmp 
<console>:8: error: not found: value tmp 
Các vấn đề liên quan