Scala лучше печатать

Я часто обнаруживаю, что занимаюсь такими вещами, как:

<code>println(foo)
</code>

когда я хотел бы сделать:

<code>println foo
</code>

Компилятор не позволяет этого.

Кроме того, println - полный рот, я действительно просто хочу сказать:

<code>echo foo
</code>

Итак, в объекте базового пакета я создал эхо-версию println:

<code>def echo(x: Any) = Console.println(x)
</code>

Достаточно просто, эхо-приложение широко, отлично.

Теперь, как мне вызвать эхо без необходимости оборачивать Any для печати в скобках?

 virtualeyes09 апр. 2012 г., 16:59
правда, но опять же, это может также привести к тому, "почему я все время набираю 7 символов, когда могу выразить одно и то же намерение в 4 символах?"
 leedm77709 апр. 2012 г., 16:03
@Debilski - это «Как мне»? вопрос, который вызвал некоторые отличные, хотя и пугающие, взломы.The other question является «Почему не могу», чей ответ дает превосходное объяснение основной проблемы. Я голосую против закрытия.
 virtualeyes09 апр. 2012 г., 16:37
и, тем не менее, его не следует закрывать, потому что вопрос направлен на саму печать, а не только на вызов без слов.
 Debilski09 апр. 2012 г., 16:22
@dave: Вы правы. Он должен был быть закрыт задолго до того, как эти пугающие хаки могли быть опубликованы.
 Debilski09 апр. 2012 г., 13:47
возможный дубликатWhy can't I write println "Hello world" in Scala?

Ответы на вопрос(5)

trait ShortCuts {
  def echo(x: Any) = Console.println(x)
  def trace[T](x: T): T = { echo(x); x }
  // ...
}

object ↬ extends ShortCuts

и используйте счастливо без скобок:

↬ echo "hello!"
 17 мая 2018 г., 20:43
не работает: & lt; console & gt;: 1: error: & al;; ожидаемый, но найденное целое число & Quot;
 virtualeyes09 апр. 2012 г., 14:11
k, получи это, println, echo, что угодно, у тебя должен быть контекст, чтобы вызывать без паренов.
object ∊ {def cho(s: Any) {println(s)}}

∊cho "Hello world"

Это работает, потому что & # x220A; является математическим символом в наборе Unicode Sm, поэтому считается какоператор в Скала, поэтому не требуется пробелов при размещении рядом с буквенно-цифровыми символами.

Вы могли бы также

object echo {def -(s: Any) {println(s)}}

echo-"Hello world"

который работает довольно хорошо ИМО.

YEARS LATER EDIT: другое почти решение с использованием StringContext:

implicit class PimpMyString(sc: StringContext) {
  def echo(args: Any*) = println(sc.raw(args: _*))
}

echo"Hello World"
 09 апр. 2012 г., 14:48
Ну и дела - что за хак!
 10 апр. 2012 г., 00:51
Почему бы и нетcout<<"Hello world"?
 virtualeyes09 апр. 2012 г., 16:21
интересно, немного, однако ;-) Straight & quot; echo (foo) & quot; это нормально, как было бы println (foo), если бы мне не пришлось печатать все целиком (автозаполнение IDE, выбор из списка на самом деле медленнее, чем простое создание, кстати)
 10 апр. 2012 г., 08:55
Теперь единственная проблема состоит в том, чтобы выяснить, как печатать быстрее, чем вводить скобки.

Identity тип, который имеетprintln метод.

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> val foo = 1
foo: Int = 1

scala> foo println
1

Если вы не хотите зависеть от скалаза, вы можете создать свою собственную идентификацию pimped и поместить неявную для нее в объект пакета.

 virtualeyes09 апр. 2012 г., 16:22
Хорошо, я фактически начал с неявного до клонирования println из PreDef. Смотрите мою обновленную альтернативу

начиная с того, что это не может быть сделано, до того, что это может быть сделано, с этим символьно-зависимым хаком или с этой зависимостью (Scalaz)

@Nikita правильно указывает, что можно так же легко добавить фрагмент к их IDE (если это так, как вы катаетесь), который выполняет println "legwork". Хотя это и так, вам, как правило, нужно прекратить печатать, чтобы выполнить ctrl-p-r или любую другую комбинацию клавиш, которую вы решите использовать, что нарушает ваш поток, IMO. Таким образом, в духе создания «лучше» println, вот мое мнение:

Создайте объект базового пакета, от которого будут наследоваться ваши подпакеты (модель, представление, дао и т. Д.) (В основном, ваш собственный PreDef)

package com
package object company {

  // echo(foo)
  def echo(x: Any) = Console.println(x)

  // foo.echo   
  class AnyProvidesEcho(x: Any) { def echo = Console.println(x) }
  @inline implicit def any2Echo(x: Any) = new AnyProvidesEcho(x)
}

Использование:

val list = List(1,2,3)
val string = "c'est beacoup mieux mit butter"

list foreach echo
echo(string)
string.echo
 10 апр. 2012 г., 00:44
Пока вы занимаетесь этим, вы должны добавитьtrace который печатает и возвращает значение.

Скобки могут быть удалены только в так называемом бессмысленном синтаксисе, в котором у вас должен быть объект контекста с левой стороны функции, поэтому в вашем случае вы можете достичь только следующего, что в любом случае не имеет никакого смысла:

Console println x

Хотя я понимаю, почему вы хотите достичь этого, возможно, рассматривая более простые синтаксические конструкции других языков, я бы посоветовал просто придерживаться стандартного способа работы Scala, поэтому просто используйтеprintln(x) или рассмотрите другие языки. Создание метода делегирования для такой базовой стандартной функции определенно принесет вам только затруднения в будущем управлении вашими проектами - так что определенно «нет-нет» дляecho метод.

Есть пожилые люди, которые любят такие случаи: когда вы в Риме, делайте так, как делают римляне.

 09 апр. 2012 г., 19:28
@virtualeyes Из других языков вы могли бы рассмотреть Haskell, если вы ищете функциональный статический язык с хорошим синтаксисом, Python, если вы ищете популярный язык с хорошим синтаксисом (или Jython, если вы нацелены на JVM). Также имеется новорожденный Kotlin, который является своего рода улучшенным и упрощенным Scala - поскольку он является продуктом JetBrains, он, безусловно, станет популярным и будет иметь превосходную поддержку IDE. Языки, которые я только что назвал, доминируют над Scala в соответствующих областях. Я бы никогда не советовал даже касаться PHP.
 09 апр. 2012 г., 19:17
@virtualeyes Вероятность того, что JVM нарушит обратную совместимость, приближается к нулю. Существует большая вероятность того, что некоторые люди, работающие с вашим кодом, не поймут, что происходит, пока они не изучат ваши настройки через стандартные API-интерфейсы. Есть даже неплохой шанс, что через некоторое время у вас самих возникнут проблемы с пониманием этого кода. Также после того, как вы привыкнете к своим собственным API, вам будет гораздо сложнее понять код, который вы не написали. И, безусловно, такие вещи не будут высоко оценены командой, если вам когда-либо придется работать в одном.
 virtualeyes09 апр. 2012 г., 20:44
Вы можете прыгать эхо на любой и обойти необходимость в Parens
 virtualeyes09 апр. 2012 г., 14:07
Спасибо, я не вижу опасности здесь. Я ничего не делегирую, нулевые накладные расходы, просто метод в объекте базового пакета. Если в будущем Scala / Java использует что-то отличное от Console.println (), то есть одно место для внесения изменений. Что касается рассмотрения других языков, основанных на моем желании печатной альтернативы, не уверен, что сказать. Scala полностью & amp; Совершенно верно, я должен использовать PHP вместо Scala, основываясь на том факте, что они используют эхо? ;-)
 virtualeyes09 апр. 2012 г., 19:38
да, командный аспект - это хороший момент, а также взаимодействие с Java / знакомство / соглашение. Обычно мне было бы все равно, но операторы println являются настолько распространенной задачей разработки, что я бы хотел поэкспериментировать с более короткой формой, echo. Само собой разумеется, что я - шоу для одного человека, дизайн от базы данных до кода, так что беспокойство членов команды не будет проблемой (не сейчас, во всяком случае)

Ваш ответ на вопрос