Вопрос по echo, parentheses, println, scala – Scala лучше печатать

5

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

<code>println(foo)
</code>

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

<code>println foo
</code>

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

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

<code>echo foo
</code>

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

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

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

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

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

Ваш Ответ

5   ответов
5

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

object ↬ extends ShortCuts

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

↬ echo "hello!"
не работает: & lt; console & gt;: 1: error: & al;; ожидаемый, но найденное целое число & Quot;
k, получи это, println, echo, что угодно, у тебя должен быть контекст, чтобы вызывать без паренов. virtualeyes
1

начиная с того, что это не может быть сделано, до того, что это может быть сделано, с этим символьно-зависимым хаком или с этой зависимостью (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
Пока вы занимаетесь этим, вы должны добавитьtrace который печатает и возвращает значение.
3

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

Console println x

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

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

Вы можете прыгать эхо на любой и обойти необходимость в Parens virtualeyes
Спасибо, я не вижу опасности здесь. Я ничего не делегирую, нулевые накладные расходы, просто метод в объекте базового пакета. Если в будущем Scala / Java использует что-то отличное от Console.println (), то есть одно место для внесения изменений. Что касается рассмотрения других языков, основанных на моем желании печатной альтернативы, не уверен, что сказать. Scala полностью & amp; Совершенно верно, я должен использовать PHP вместо Scala, основываясь на том факте, что они используют эхо? ;-) virtualeyes
да, командный аспект - это хороший момент, а также взаимодействие с Java / знакомство / соглашение. Обычно мне было бы все равно, но операторы println являются настолько распространенной задачей разработки, что я бы хотел поэкспериментировать с более короткой формой, echo. Само собой разумеется, что я - шоу для одного человека, дизайн от базы данных до кода, так что беспокойство членов команды не будет проблемой (не сейчас, во всяком случае) virtualeyes
@virtualeyes Вероятность того, что JVM нарушит обратную совместимость, приближается к нулю. Существует большая вероятность того, что некоторые люди, работающие с вашим кодом, не поймут, что происходит, пока они не изучат ваши настройки через стандартные API-интерфейсы. Есть даже неплохой шанс, что через некоторое время у вас самих возникнут проблемы с пониманием этого кода. Также после того, как вы привыкнете к своим собственным API, вам будет гораздо сложнее понять код, который вы не написали. И, безусловно, такие вещи не будут высоко оценены командой, если вам когда-либо придется работать в одном.
@virtualeyes Из других языков вы могли бы рассмотреть Haskell, если вы ищете функциональный статический язык с хорошим синтаксисом, Python, если вы ищете популярный язык с хорошим синтаксисом (или Jython, если вы нацелены на JVM). Также имеется новорожденный Kotlin, который является своего рода улучшенным и упрощенным Scala - поскольку он является продуктом JetBrains, он, безусловно, станет популярным и будет иметь превосходную поддержку IDE. Языки, которые я только что назвал, доминируют над Scala в соответствующих областях. Я бы никогда не советовал даже касаться PHP.
11
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"
Почему бы и нетcout<<"Hello world"?
Ну и дела - что за хак!
интересно, немного, однако ;-) Straight & quot; echo (foo) & quot; это нормально, как было бы println (foo), если бы мне не пришлось печатать все целиком (автозаполнение IDE, выбор из списка на самом деле медленнее, чем простое создание, кстати) virtualeyes
Теперь единственная проблема состоит в том, чтобы выяснить, как печатать быстрее, чем вводить скобки.
4

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

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

scala> val foo = 1
foo: Int = 1

scala> foo println
1

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

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

Похожие вопросы