Почему Java не имеет способа указать незавершенные Строковые литералы?

Я думаю, что понял, но потребовалось некоторое время, чтобы понять, как работать с выражениями. Я сослался на историю этого поста [117], чтобы узнать, как построить System.Linq.Expressions.Expression. Вот что у меня есть:

open System.Linq.Expressions
open Microsoft.FSharp.Linq.RuntimeHelpers

...

let toProdRptExpr : Expression> =
  <@ Func<_, _> (fun (i:CostItem) -> i.ProductionReport) @>
  |> LeafExpressionConverter.QuotationToExpression 
  |> unbox>>

let toCostItemsExpr : Expression>> = 
  <@ Func<_,_> (fun (pr:ProductionReport) -> pr.CostItems) @>
  |> LeafExpressionConverter.QuotationToExpression 
  |> unbox>>>

let a = builder.HasOne(toProdRptExpr)
let b = a.WithMany(toCostItemsExpr)

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

РЕДАКТИРОВАТЬ

Для краткости вы можете создать функцию типа

let toExpr (f:'a -> 'b) = 
  <@ Func<_,_> (f) @>
  |> LeafExpressionConverter.QuotationToExpression 
  |> unbox>>

и затем использовать ее как

builder
  .HasOne(toExpr(fun (i:CostItem) -> i.ProductionReport))
  .WithMany(toExpr(fun (pr:ProductionReport) -> pr.CostItems))

[1114 ] Но вы должны быть осторожны, потому что похоже, что CostItem и ProductionReport являются взаимно-ссылочными (см. Обсуждение в комментариях ниже). Это означает, что они должны быть определены в одном файле и использовать ключевое слово and (см. этот пример)

6
задан shsteimer 8 March 2009 в 17:02
поделиться

8 ответов

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

Например, в C# существует много быстрых способов сделать вещь как свойства:

public int Foo { get; set; }

и дословные строки:

String bar = @"some
string";

Java имеет тенденцию избегать как можно большего количества сахара синтаксиса. Если Вы хотите методы считывания и методы set для поля, необходимо сделать это:

private int foo;

public int getFoo() { return this.foo; }
public int setFoo(int foo) { this.foo = foo; }

и строк нужно оставить:

String bar = "some\nstring";

Я думаю, что это - потому что большим количеством способов C# и Java имеют различные цели дизайна. C# быстро разрабатывается со многими постоянно добавляемыми функциями, но большинство которых имеет тенденцию быть сахаром синтаксиса. Java, с другой стороны, о простоте и простоте понимания. Большим количеством причин, что Java был создан во-первых, были реакции против сложности C++ синтаксиса.

5
ответ дан 9 December 2019 в 22:40
поделиться

Я нахожу это забавным "почему" вопросы. C# является более новым языком и пытается улучшиться в том, что рассматривается как недостатки на других языках, таких как Java. Простая причина, "почему" вопрос - стандарт Java, не определяет оператор такой как в C#.

2
ответ дан 9 December 2019 в 22:40
поделиться

Я думаю, что одна из причин - то, что регулярные выражения (которые являются основной причиной подобных Строковых литералов), где не часть платформы Java до Java 1.4 (если я помню правильно). Просто не было большой части потребности в этом, когда язык был определен.

1
ответ дан 9 December 2019 в 22:40
поделиться

Как сказанный, главным образом то, когда Вы хотите к символам ESC, для regexes. В этом случае используйте: Pattern.quote ()

2
ответ дан 9 December 2019 в 22:40
поделиться

Java (к сожалению), не имеет ничего как это, но Groovy делает:

assert '''hello,
world''' == 'hello,\nworld'
//triple-quotes for multi-line strings, adds '\n' regardless of host system
assert 'hello, \
world' == 'hello, world' //backslash joins lines within string

Мне действительно понравилась эта функция C# назад, когда я сделал некоторую работу.NET. Это было особенно полезно для вырезанных и вставленных SQL-запросов.

1
ответ дан 9 December 2019 в 22:40
поделиться

Я не уверен в, почему, но можно сделать это путем выхода из символа ESC. Так как всем символам ESC предшествует обратная косая черта путем вставки двойной обратной косой черты, можно эффективно отменить символ ESC. например, "\now" произведет новую строку затем буквы "ой", но "\now" произведет "\now"

0
ответ дан 9 December 2019 в 22:40
поделиться

Я думаю, что этот вопрос похож: "Почему Java не чувствителен к добавлению отступа как Python?" Упомянул, что синтаксис является сахаром, но это избыточно (лишний).

0
ответ дан 9 December 2019 в 22:40
поделиться

Необходимо найти, что IDE решает проблему для Вас. Если Вы посреди Строки и необработанного текста вставки копии в нее, она должна выйти из текста для Вас.

Perl имеет более широкое множество способов установить Строковые литералы и иногда жаль, что Java не поддерживал их также.;)

0
ответ дан 9 December 2019 в 22:40
поделиться