Scala: может ли буквальная ссылка сама по себе? - PullRequest
5 голосов
/ 07 июля 2011

Я хочу сделать что-то вроде этого:

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

Это, очевидно, не сработает, так как я не могу ссылаться на "Hello world" без предварительного сохранения его в качестве значения.

Есть ли способ добиться этого?

Ответы [ 2 ]

22 голосов
/ 07 июля 2011

Если вам нужен только последний символ строки, вы можете просто сделать:

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

Для решения общей проблемы вы можете использовать оператор прямого канала, как показано ниже:

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

Вы можете определить оператора прямой трубы, как показано ниже, или использовать тот, который доступен в 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}
3 голосов
/ 07 июля 2011

Вы не можете ссылаться на сам литерал, но вы можете создать блок с временной переменной, локальной для этого блока.

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

scala> tmp
<console>:8: error: not found: value tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...