http://openjdk.java.net/jeps/326
JEP 326: Raw String Literals
Owner Jim Laskey Created 2018/01/23 15:40 Updated 2018/04/03 18:29 Type Feature Status Candidate Component specification / language Scope SE Discussion amber dash dev at openjdk dot java dot net Effort M Duration M Priority 3 Reviewed by Alex Buckley Endorsed by Brian Goetz Release tbd_major Issue 8196004
Summary
Javaè¨èªã«raw string literalsã追å ãã¾ããraw string literalã¯è¤æ°è¡ã®ã½ã¼ã¹ã³ã¼ãã«å±éå¯è½ã§ã\n
ãã\uXXXX
å½¢å¼ã®ã¦ãã³ã¼ãã¨ã¹ã±ã¼ããªã©ãã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãè§£éãã¾ããã
Goals
- 以ä¸ã«ããéçºè ã®å¹çãé«ãã¾ãã
- raw string literalsã¯å¾æ¥ã®æååãªãã©ã«ã¨åçãªæååã表ç¾å¯è½ããã ããã©ãããã©ã¼ã åºæã®æ¹è¡ã¯é¤ãã
- ã¨ã¹ã±ã¼ãã®ç¾è¡ã®
javac
æååãªãã©ã«å¦çããã³å·¦ãã¼ã¸ã³ã®ããªã ã¨åæ§ãªãã¨ãããã©ã¤ãã©ãª
Non-Goals
- æ°è¦ã®Stringæ¼ç®åã¯å°å ¥ããªãã
- Raw string literalsã¯æååè£éãããã«ã¯ãµãã¼ããã¾ãããå°æ¥ã®JEPã§å°å ¥ããå¯è½æ§ã¯ããã¾ãã
- 徿¥ã®æååãªãã©ã«ã«ã¯å¤æ´ã¯ããã¾ãããããã«ã¯ä»¥ä¸ãå«ã¿ã¾ãã
- éå§ã»çµäºããã«ã¯ãªã¼ãã®ç¹°ãè¿ãã«ããããªãã¿ã®ã«ã¹ã¿ãã¤ãº
- ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã®å¦ç
Motivation
ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã¯Javaãå«ãå¤ãã®ããã°ã©ãã³ã°è¨èªã§å®ç¾©ããã¦ãããç´æ¥æ¸ãã®ãé£ããæåã表ç¾ããã®ã«ä½¿ãã¾ãããã¨ãã°ãã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹\n
ã¯ASCIIã®æ¹è¡ãæå³ãã¾ããäºè¡ã§"hello"ã¨"world"ã表示ããã«ã¯ãæåå"hello\nworld\n"
ã使ãã¾ãã
System.out.print("hello\nworld\n");
以ä¸ã®ãããªè¡¨ç¤ºã«ãªãã¾ãã
hello world
å¯èªæ§ã«é£ç¹ãããä»ããã®ä¾ã¯UNIXãã¼ã¹ã®ã·ã¹ãã ãã¿ã¼ã²ããã«ãã¦ãã¾ããããã以å¤ã®OSã§ã¯\r\n
(Windows)ãªã©ç°ãªãæ¹è¡è¡¨ç¾ã使ç¨ããå ´åãããã¾ããJavaã«ã¯ãprintln
ãªã©é«ã¬ãã«ã®ã¡ã½ããããããããã¯ãã©ãããã©ã¼ã ã«é©åãªæ¹è¡æåã使ç¨ãã¾ãã
System.out.println("hello"); System.out.println("world");
GUIã©ã¤ãã©ãªã§"hello"ã¨"world" ã表示ããå ´åãå¶å¾¡æåã¯æå³ãç¡ãå ´åãããã¾ãã
ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãããã¯ã¹ã©ãã·ã¥ãã¯Javaã®æååãªãã©ã«ã§ã¯\\
ã§ããäºéã®ããã¯ã¹ã©ãã·ã¥ã¯Leaning Toothpick Syndrome*1ãçã¿åºããéå°ãªããã¯ã¹ã©ãã·ã¥ãæååã®çè§£ãé£ããããã¾ããJavaãããããã¯ä»¥ä¸ã®ãããªä¾ãè¯ã使ãã¾ãã
Path path = Paths.get("C:\\Program Files\\foo");
ããã«ã¯ãªã¼ãæåã使ãããã®\"
ãªã©ã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãåæ§ã«éJavaããã°ã©ããè¦ãå ´åã«çè§£ãé£ããããã¾ããä¾ãã°ãããã«ã¯ãªã¼ããå«ãæååãæ¤ç´¢ããã«ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
Pattern pattern = Pattern.compile("\\\"");
å®éã®ã¨ãããã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã¯ä¾å¤çäºé ã§ããJavaã®æ¥å¸¸çãªéçºã«åºã¦ãããã®ã§ã¯ããã¾ãããå¶å¾¡æåãä½¿ãæ©ä¼ã¯å°ãªããã¨ã¹ã±ã¼ãã®åå¨ã¯å¯èªæ§ã¨ã¡ã³ããã³ã¹æ§ã«æªå½±é¿ãåã¼ãã¾ããOnce we come to this realization, the notion of a non-interpreted string literal becomes a well reasoned result.
ç¾å®ã®Javaã³ã¼ãã«ã¯ãä»ã®ããã°ã©ã ï¼SQL, JSON, XML, æ£è¦è¡¨ç¾ãªã©ï¼ã®ã³ã¼ããåãè¾¼ããã¨ãããããããã¯ãã¦ãã³ã¼ãã¨ã¹ã±ã¼ãã»ããã¯ã¹ã©ãã·ã¥ã»æ¹è¡ãé¤ãã¨ããªãã©ã«æååãã®ã¾ã¾ã§ãã£ããã£ãããä»çµã¿ãå¿ è¦ã¨ãã¾ãã
æ¬JEPã®ææ¡ã¯ãraw string literalãã¨ããæ°ãã種é¡ã®ãªãã©ã«ãææ¡ãã¾ããJavaã®ã¨ã¹ã±ã¼ãã¨è¡ç«¯ä»æ§ã¨ã¯å¥éã§ãå¤ãã®ç¶æ³ä¸ã§æ¢åã®æååãªãã©ã«ãããå¯èªæ§ã¨ã¡ã³ããã³ã¹æ§ã«åªããæååãæä¾ãã¾ãã
File Paths Example
Traditional String Literals
Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
Raw String Literals
Runtime.getRuntime().exec(`"C:\Program Files\foo" bar`);
Multi-line Example
Traditional String Literals
String html = "<html>\n" + " <body>\n" + " <p>Hello World.</p>\n" + " </body>\n" + "</html>\n";
Raw String Literals
String html = `<html> <body> <p>Hello World.</p> </body> </html> `;
Regular Expression Example
Traditional String Literals
System.out.println("this".matches("\\w\\w\\w\\w"));
Raw String Literals
System.out.println("this".matches(`\w\w\w\w`));
Output:
true
Polyglot Example
Traditional String Literals
String script = "function hello() {\n" + " print(\'\"Hello World\"\');\n" + "}\n" + "\n" + "hello();\n"; ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(script);
Raw String Literals
String script = `function hello() { print('"Hello World"'); } hello(); ` ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Object obj = engine.eval(script);
Output:
"Hello World"
Database Example
Traditional String Literals
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" + "WHERE `CITY` = âINDIANAPOLIS'\n" + "ORDER BY `EMP_ID`, `LAST_NAME`;\n";
Raw String Literals
String query = `` SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = âINDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; ``;
Description
raw string literalã¯ãªãã©ã«ã®æ°ããå½¢å¼ã«ãªãã¾ãã
Literal: IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral RawStringLiteral NullLiteral RawStringLiteral: RawStringDelimiter RawInputCharacter {RawInputCharacter} RawStringDelimiter RawStringDelimiter: ` {`}
raw string literalã¯1æå以ä¸ãããã¯ã¯ãªã¼ã`
(\u0060
) (backquote, accent grave)ã®ã·ã¼ã±ã³ã¹ã§å²ã¿ã¾ããraw string literalã¯1ã¤ä»¥ä¸ã®ããã¯ã¯ãªã¼ãã§éå§ããåæ°ã®ããã¯ã¯ãªã¼ãã§çµäºãã¾ããç°ãªãåæ°ã®ããã¯ã¯ãªã¼ãã¯æååã®ä¸é¨ã¨ãã¦æ±ãã¾ãã
raw string literalå ã¸ã®ããã¯ã¯ãªã¼ãã®åãè¾¼ã¿ã¯éå§çµäºã®ããã¯ã¯ãªã¼ãã®æ°ã墿¸ããããã¨ã§å¯¾å¿å¯è½ã§ãã
raw string literalã®æåã¯ãCRã¨CRLFãé¤ããè§£éãè¡ãã¾ãããCR(\u000D
)ã¨CRLF(\u000D\u000A
)ã¯å¸¸ã«LF(\u000A
)ã«å¤æããã¾ãããã®å¤æã¯ãã©ãããã©ã¼ã éã®æ¯ãèãã®é©ããæå°ã«ããããã§ãã
ããã¯ã¯ãªã¼ãã®éå§ãããã対å¿ããçµäºãç¡ãå ´åã³ã³ãã¤ã«æã¨ã©ã¼ã«ãªãã¾ãã
Javaè¨èªä»æ§ã§ã¯å¾æ¥ã®æååãªãã©ã«ã«ã¯äºç¨®é¡ã®ã¨ã¹ã±ã¼ããã¦ãã³ã¼ãã¨ã¹ã±ã¼ãã¨ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ããè¦å®ãã¦ãã¾ããRaw string literalsã¯ã¨ã¹ã±ã¼ããè§£éãã¾ãããã¤ã¾ããã¨ã¹ã±ã¼ãæååã¯ãã®ã¾ã¾ã«ãªãã¾ãã
\uxxxx
å½¢å¼ã®ã¦ãã³ã¼ãã¨ã¹ã±ã¼ãã¯ãåå¥è§£æã«ããè§£éåã«æååå
¥åã®ä¸é¨ã¨ãã¦å¦çããã¾ããraw string literalã®è¦æ±ããµãã¼ãããããã«ãåå¥è§£æãããã¯ã¯ãªã¼ãã®éå§ãè¦ã¤ãããã¦ãã³ã¼ãã¨ã¹ã±ã¼ãå¦çãç¡å¹åããçµäºãããå度æå¹åãã¾ããä¸è²«æ§ãä¿ã¤ãããã¦ãã³ã¼ãã¨ã¹ã±ã¼ã\u0060
ã¯ãããã¯ã¯ãªã¼ãã®ä»£æ¿ã¨ãã¦ã¯ä½¿ãã¾ããã
以ä¸ã¯raw string literalsã®ä¾ã§ãã
`"` // a string containing " alone ``can`t`` // a string containing 'c', 'a', 'n', '`' and 't' `This is a string` // a string containing 16 characters `\n` // a string containing '\' and 'n' `\u2022` // a string containing '\', 'u', '2', '0', '2' and '2' `This is a two-line string` // a single string constant
classãã¡ã¤ã«ã§ã¯ãããæåå宿°ãraw string literalã徿¥ã®æååãªãã©ã«ç±æ¥ãã©ããã¯è¨é²ãã¾ããã
徿¥ã®æååãªãã©ã«åæ§ãraw string literalã¯å¸¸ã«java.lang.String
åã§ããraw string literalsç±æ¥ã®æååãã徿¥ã®æååãªãã©ã«ç±æ¥ã®æååã¨åæ§ã®æ±ãã§ãã
Escapes
ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãè§£éããªãè¤æ°è¡æååãéçºè
ãæãå¯è½æ§ã¯é«ãã§ãããã®è¦æ±ã«å¿ãããããString
ã¯ã©ã¹ã«ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãå®è¡æã«è§£éããã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã追å ãã¾ãã
public String unescape()
ãã®ã¡ã½ããã¯ãJLSãå®ç¾©ãã¦ããã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ï¼3.3 Unicode Escapes, 3.10.6. Escape Sequences for Character and String Literalsï¼ã¨åä¸ã¹ãã«ã®\
ãé ã«ã¤ããæåãããã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã表ç¾ããæåã«å¤æãã¾ãã
ä¾ï¼b0ããb3ã¯trueã«ãªãï¼
boolean b0 = `\n`.equals("\\n"); boolean b1 = `\n`.unescape().equals("\n"); boolean b2 = `\n`.length == 2; boolean b3 = `\n`.unescape().length == 1;
ã¨ã¹ã±ã¼ã夿ãç´°ããå¶å¾¡ã§ããã¡ã½ãããæä¾ãã¾ãã
ã¾ããã¨ã¹ã±ã¼ãå転ãã¼ã«ç¨ã®ã¡ã½ãããããã¾ãã以ä¸ã®ã¡ã½ãããString
ã«è¿½å ãã¾ãã
public String escape()
ãã®ã¡ã½ããã¯ã' '
ããå°ãããã¹ã¦ã®æåãUnicodeãcharacter escape sequencesã«å¤æãã'~'ããä¸ã®æåã¯Unicode escape sequencesã«å¤æã"
, '
, \
ã¯ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã«å¤æãã¾ãã
ä¾ï¼b0ããb3ã¯trueã«ãªãï¼
boolean b0 = "\n".escape().equals(`\n`); boolean b1 = `â¢`.escape().equals(`\u2022`); boolean b2 = "â¢".escape().equals(`\u2022`); boolean b3 = !"â¢".escape().equals("\u2022");
Source Encoding
ã½ã¼ã¹ãã¡ã¤ã«ã«éASCIIæåãããå ´åãjavacã³ãã³ãï¼javac -encodingï¼ã§æ£ããã¨ã³ã³ã¼ãã£ã³ã°ã使ãå¿ è¦ãããã¾ãããããã¯ãraw stringã«é©åãªUnicodeã¨ã¹ã±ã¼ããããUnicodeã¨ã¹ã±ã¼ããé©åãªéASCIIã«å¤æããã©ã¤ãã©ãªã使ç¨ãã¾ãã
Margin Management
è¤æ°è¡æååã®èª²é¡ã®ä¸ã¤ã«ãå·¦ãã¼ã¸ã³ï¼ãããããã¢ããã¥ã¡ã³ãï¼ããå¨å²ã®ã³ã¼ãã®ã¤ã³ãã³ãã§æååããã©ã¼ããããããããããã¾ããçæ³çã«ã¯ãæååã¯å¨å²ã®ã³ã¼ãã¨ãã¬ã³ãããããã§ãããã£ã¦åé¡ã¯ãä½åãªå·¦ã¹ãã¼ã¹ã®æ±ãæ¹ãã©ãããããã«ãªãã¾ãã
æè»ã«å¯¾å¦åºæ¥ãããã«ãããããraw string literalsã®ãã¼ã¸ã³ã¯ã¹ãã£ã³ããã¾ããä½åãªå·¦ã¹ãã¼ã¹ãããªã ããã¡ã½ãããString
ã«è¿½å ããäºå®ã§ãã
Alternatives
Choice of Delimiters
徿¥ã®æååãªãã©ã«ã¨raw string literalã¯ä¸¡æ¹ã¨ãããªãã¿ã§æåã·ã¼ã±ã³ã¹ãå²ã¿ã¾ãã徿¥ã®æååãªãã©ã«ã¯éå§ã»çµäºã®ããªãã¿ã«ããã«ã¯ãªã¼ãæåã使ãã¾ãããã®å¯¾ç§°æ§ã«ãããªãã©ã«ã®èªã¿è¾¼ã¿ã¨ãã¼ã¹ã¯ç°¡åã§ããraw string literalã対称æ§ã®ããããªãã¿ãç¨ãã¾ãããå¥ã®ç°ãªãããªãã¿ã使ãå¿ è¦ããããããã¯æåã·ã¼ã±ã³ã¹å ã«ã¨ã¹ã±ã¼ããä»ä¸ããªãããã«ã¯ãªã¼ãã使ãå¯è½æ§ãããããã§ããraw string literalã®ããªãã¿ã®é¸æã«ã¯ä»¥ä¸ã®èæ ®äºé ãããã¾ãã
- ããªãã¿ã¯çãæååã»ãã¼ã¸ã³ç®¡çã»ä¸è¬çãªå¯èªæ§ã§å¹æçã§ããããã«å¤§ä»°ãªãã®ã«ãªããªããã¨ã
- éå§ããªãã¿ã¯ãã®å¾ã«raw string literalã®ããã£ãç¶ããã¨ãæç¢ºã«ç¤ºããã¨ã
- çµäºããªãã¿ã¯æååã«ãã¾ãåºã¦ããªããã®ãªãã¨ãçµäºããªãã¿ãæååå ã«åºç¾ããå ´åãçµäºããªãã¿ã®åãè¾¼ã¿ã«ã¼ã«ã¯æç¢ºãã¤ã·ã³ãã«ãªãã¨ãåãè¾¼ã¿ã¯ã¨ã¹ã±ã¼ãç¡ãã®å®ç¾ãå¿ é ã§ãã
ããªãã¿ã«ã¯ä»ã®ã¨ãã3ã¤ã®Latin1æåãsingle-quote, double-quote, and backtickãã¨ãã¦ãã¾ãããã以å¤ã¯æå¿«ãã«å½±é¿ãåã¼ãã徿¥ã®æååãªãã©ã«ã¨ã®éã«ä¸è²«æ§ãæ¬ ãã¨èãã¦ãã¾ãã
徿¥ã®æååãªãã©ã«ã¨raw string literalã¨ã«éããåºãå¿
è¦ãããã¾ããããã«ã¯ãªã¼ã以å¤ã®æåãã«ã¹ã¿ã ãã¬ã¼ãºã§ãã種ã®è¤åããªãã¿ãä½ããã¨ã«ãããraw string literalsã§ããã«ã¯ãªã¼ãã使ããã¨ã¯åºæ¥ã¾ãããã¨ãã°$"xyz"$
ãabcd"xyz"abcd
ãªã©ã§ãããããè¤åããªãã¿ã¯åºæ¬çãªè¦ä»¶ã¯æºããã¾ãããæå¿«ãã«æ¬ ããçµäºããªãã¿ã®åãè¾¼ã¿ã¯ã·ã³ãã«ã§ã¯ããã¾ãããAlso, there is a temptation in the custom phrases case to assign semantic meaning to the phrase, heralding another industry similar to Java annotations.
é£ç¶ã¯ã©ã¼ãã"""xyz"""
ãã«ã¤ãã¦ãããã«ã¤ãã¦ã¯ææ§ããåé¿ããã®ãé¢åã§ãããã¨ãã°"" + x + ""
ã¯ã徿¥æååãªãã©ã«ï¼å¤æ°ï¼å¾æ¥æååãªãã©ã«ã®çµåã¨ãã¦ãã" + x + "
ã¨ãã7æåã® raw string literalã¨ãã¦ã§ããã¼ã¹ãå¯è½ã§ãã
ããã¯ã¯ãªã¼ãã®å©ç¹ã¯å¥ã®ç®çã§ä½¿ãããªãç¹ã§ããé£ç¶ã¯ãªã¼ãã¨ç©ºæåã§çºçããææ§ããåé¿ã§ãã¾ããJavaè¨èªä»æ§ã®ç¨èªã«ãããæ°ããããªãã¿ã«ãªãã¾ããããã¯ã¯ãªã¼ãã¯ãã·ã³ãã«ãªåãè¾¼ã¿ã«ã¼ã«ãå«ããããªãã¿ã®è¦æ±ããã¹ã¦æºããã¾ãã
ããªãã¿ã®é¸æã«ãããå¥ã®èæ ®äºé ã¯å°æ¥ã®æè¡çºå±ã®å¯è½æ§ã§ããrawããã³å¾æ¥ã®æååãªãã©ã«ã®ä¸¡æ¹ã§ã·ã³ãã«ãªããªãã¿ã使ç¨ãããããªãã¨ããå°æ¥ã®æè¡ã§ã¯åºæ¥ãããããã¾ããã
ãã®JEPã§ã¯ããã¯ã¯ãªã¼ããææ¡ãã¾ããè¨èªã®ç¾å¨ã®ã¯ãªã¼ãã¨ã¯ç°ãªãã¾ãããåæ§ã®ç®çãæããã¾ãã
Multi-line Traditional String Literals
ãã®ãªãã·ã§ã³ã¯raw string literalã¨ã¯å¥ã¢ãã§ãããraw string literalsã«å ãã¦å¾æ¥ã®æååãªãã©ã«ã«è¤æ°è¡æ©è½ãæããããã¨ãåççããããã¾ããããã®æ©è½ãæå¹åããã¨å¾æ¥ã®æååãªãã©ã«ã®è¤æ°è¡ãã¨ã©ã¼ã«ãããã¼ã«ã¨ãã¹ãã«å½±é¿ãåºãå¯è½æ§ãããã¾ãã
Other Languages
Javaã¯ãraw stringsãè¨èªã¬ãã«ã§ãµãã¼ãããªããæ°å°ãªãç¾ä»£çãªããã°ã©ãã³ã°è¨èªã°ã«ã¼ãã®1ã¤ã«åãæ®ããã¦ãã¾ãã
以ä¸ã®è¨èªãC, C++, C#, Dart, Go, Groovy, Haskell, Java, JavaScript, Kotlin, Perl, PHP, Python, R, Ruby, Scala, Swiftãã¯raw string literalsããµãã¼ããã¦ãããããªãã¿ã¨rawããã³è¤æ°è¡æååã®ä½¿ç¨æ¹æ³ã«ã¤ãã¦èª¿æ»ãã¾ãããUnixãã¼ã«ã®bash, grep, sedã®æåå表ç¾ã調æ»ãã¾ããã
è¤æ°è¡ãªãã©ã«åé¡ã®è§£æ¶ã«ã¯ã徿¥ã®æååãªãã©ã«ã®ããã«ã¯ãªã¼ãã®ããã£ã§CRã¨LFã使ããããã«Java仿§ã夿´ãããã¨ããææ³ãããã¾ãããã ããããããããã«ã¯ãªã¼ãã®ä½¿ãæ¹ã§ã¯ã¨ã¹ã±ã¼ãã®è§£éãå¿ è¦ã§ãã
ç°ãªãè§£éã®æ¯ãèããæç¤ºããã«ã¯ãç°ãªãããªãã¿ãå¿ è¦ã§ããJava以å¤ã®è¨èªã§ã¯æ§ã ãªããªãã¿ãæ¡ç¨ãã¦ãã¾ãã
Delimiters | Language/Tool |
---|---|
"""...""" |
Groovy, Kotlin, Python, Scala, Swift |
`...` |
Go, JavaScript |
@"..." |
C# |
R"..." |
Groovy (old style) |
R"xxx(...)xxx" |
C/C++ |
%(...) |
Ruby |
qq{...} |
Perl |
Python, Kotlin, Groovy and Swiftã¯raw stringsã«ã¯ããã«ã¯ãªã¼ã3ã¤ã使ãã¾ããããã¯æ¢åã®æååãªãã©ã«ã¨ã®é£ç¶æ§ãåæ ãããã®ã§ãã
Go and JavaScriptã¯ããã¯ã¯ãªã¼ãã§ããæååã§ãã¾ã使ãããªãæåã鏿ãã¦ãã¾ããMarkdownã¨ã®ç¸æ§ã¯è¯ããªãã§ããã大åã®å ´åã§ã¯åé¡ããã¾ããã
ç°è²ã©ããã§ã¯ãC#ã®@"..."
ãªã©ã®ã¡ã¿ã¿ã°ã¯æ¬JEPã§ææ¡ããããã¯ã¯ãªã¼ãã¨æ©è½çã«ä¼¼ã¦ãã¾ãããããã@
ã¯Javaã§ã¯ã¢ããã¼ã·ã§ã³ã示åãã¾ããããããã¡ã¿ã¿ã°ã®ä½¿ç¨æ³ãæã¡è¾¼ããã¨ã¯ãå°æ¥çã«ãã®ã¡ã¿ã¿ã°ã®ä½¿ç¨ãå¶éãã¾ãã
Heredoc
raw stringsã®ã¯ãªã¼ãã®å¥æ¡ã«ãã¢ããã¥ã¡ã³ã*2ãããã¾ãããã¢ããã¥ã¡ã³ãã¯Unixã·ã§ã«ã§æåã«ä½¿ããå§ããPerlãªã©ã«å°å ¥ããã¾ããããã¢ããã¥ã¡ã³ãã«ã¯ãã¬ã¼ã¹ãã«ãã¨ã¨ã³ããã¼ã«ãããã¾ãããã¬ã¼ã«ãã«ãã¯æååãã³ã¼ãå ã«æ¿å ¥ããå ´æã¨ã¨ã³ããã¼ã«ãæå®ãã¾ããã¨ã³ããã¼ã«âã¯æååã®æå¾ã«ã¤ãã¾ãã
System.out.println(<<HTML); <html> <body> <p>Hello World.</p> </body> </html> HTML
ãã¢ããã¥ã¡ã³ãã¯raw stringsã®ä¸ã¤ã®æ¡ã§ã¯ããã¾ãããã¢ãã¯ãã«æããã¾ããããã«ãã¼ã¸ã³ç®¡çã®åé¡ããã¯ãçºçãã¦è¤éåãã¾ãã
Testing
徿¥ã®æååãªãã©ã«ãraw stringãªãã©ã«ã§ç½®ãæãããã¹ãã®ã³ãã¼ã使ããStringã®ãã¹ãã¹ã¤ã¼ããæ¡å¼µãã¾ãã
è¡ç«¯ããã³ã³ã³ãã¤ã«åä½ã®çµäºæã«ãããã³ã¼ãã¼ã±ã¼ã¹ã®ãã¹ãããã¬ãã£ããã¹ãã«è¿½å ãã¾ãã
ã¨ã¹ã±ã¼ãã¨ãã¼ã¸ã³ç®¡çã®ã¡ã½ããã®ãã¹ãã追å ãã¾ãã
Risks and Assumptions
æ¬JEPã®ä»®å®ã¨ãã¦ãMarkdown, Go, JavaScriptãå«ãraw string literalsã«ã¯ããã¯ã¯ãªã¼ãããã¾ãåºç¾ããããã®ãããããã¯ã¯ãªã¼ããç¹°ãè¿ãããªãã¿ãªãä»ãããç ©ããããªããã¨ãã¦ãã¾ãã