天道酬勤,学无止境

省略数组中哈希的花括号(Omission of curly braces for a hash in an array)

问题
[1, 2, 3, :a => 'A', :b => 'B'] [1, 2, 3, a: 'A', b: 'B'] [1, 2, 3, {:a => 'A', :b => 'B'}] [1, 2, 3, {a: 'A', b: 'B'}]
回答1

这似乎是 1.9 的一个新特性:

$ rvm use 1.8.7
$ irb
ruby-1.8.7-p352 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
SyntaxError: compile error
(irb):1: syntax error, unexpected tASSOC, expecting ']'
x = [ 1,2,3,:a => 4, :b => 5 ]
                 ^
  from (irb):1
ruby-1.8.7-p352 :002 > exit
$ rvm use 1.9.3
$ irb
ruby-1.9.3-p0 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
 => [1, 2, 3, {:a=>4, :b=>5}] 
ruby-1.9.3-p0 :002 >
回答2
>> [1, 2, c: 'd', e: 'f'] # ruby 1.9 hash literals => [1, 2, {:c=>"d", :e=>"f"}] >> [1, 2, c: 'd', e: 'f', 5] # syntax error, unexpected `]` (waiting for => or :)
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 围绕变量的花括号(Curly braces surrounding variable)
    问题 我有这段代码,我正试图弄清楚,我什至不知道它的语法是否正确(我猜是练习的一部分!) %{$records} 花括号代表什么? 我见过同样的情况,但使用@运算符而不是$如果这有所不同。 谢谢你们! 回答1 perlref 文档的“使用参考”部分进行了解释。 2.任何将标识符(或标识符链)作为变量或子例程名称的一部分放置的地方,都可以用返回正确类型引用的 BLOCK 替换标识符。 换句话说,前面的例子可以这样写: $bar = ${$scalarref}; push(@{$arrayref}, $filename); ${$arrayref}[0] = "January"; ${$hashref}{"KEY"} = "VALUE"; &{$coderef}(1,2,3); $globref->print("output\n"); # iff IO::Handle is loaded 在您的情况下, $records必须是对哈希的引用(因为最外面的% ), {$records}是返回引用的块,而%{$records}给出原始哈希。 花括号围绕一个真正的块。 实际上,您可以将上面的代码替换为 %{ if ($records) { $records } else { $default_records } } 但是,正如文档前面所指出的,即使是您问题中的较短版本也可以简化。 1
  • 什么时候可以省略C中的花括号?(When can I omit curly braces in C?)
    问题 我几乎可以肯定这已经被问过了,但是我找不到在任何地方回答它。 什么时候可以省略C中的花括号? 我以前看过无括号的return语句,例如 if (condition) return 5; 但这似乎并不总是适用于所有语句,即声明一个方法时。 编辑: 大括号省略的规则与Java中的规则相同吗? 回答1 如果主体包含单个语句, while只能省略if-else , for , while或do-while语句的主体的括号: if (cond) do_something(); for (;;) do_something(); while(condition) do_something(); do do_something(); while(condition); 但是,请注意,根据语法,上述每个示例都被视为单个语句。 那意味着你可以写一些类似的东西 if (cond1) if (cond2) do_something(); 这是完全合法的; if (cond2) do_something(); 简化为单个语句。 因此,就此而言, if (cond1) if (cond2) do_something(); ,因此您可能会因类似以下内容而陷入疯狂 for (i=0; i < N; i++) if (cond1) if (cond2) while (cond3) for (j=0; j <
  • Scala 中大括号和圆括号之间的正式区别是什么,何时应该使用它们?(What is the formal difference in Scala between braces and parentheses, and when should they be used?)
    问题 将参数传递给括号()和大括号{}函数之间的正式区别是什么? 我从《 Scala 编程》一书中得到的感觉是 Scala 非常灵活,我应该使用我最喜欢的那个,但我发现有些情况可以编译,而另一些则不能。 例如(仅作为示例;我将不胜感激任何讨论一般情况的回复,而不仅仅是这个特定示例): val tupleList = List[(String, String)]() val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 ) => 错误:简单表达式的非法开始 val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 } => 很好。 回答1 我曾经尝试过写这个,但最后我放弃了,因为规则有点分散。 基本上,你必须掌握它的窍门。 也许最好将注意力集中在花括号和圆括号可以互换使用的地方:在将参数传递给方法调用时。 当且仅当该方法需要单个参数时,您可以用花括号替换括号。 例如: List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
  • 什么时候在 Perl 中使用花括号取消引用有好处?(When is it advantageous to use curly braces for dereferencing in Perl?)
    问题 看到一段代码是这样的~ my @array = @{ $array_ref }; 而且我发现如果我把它改成一样有效~ my @array = @$array_ref; 同样,这个~ my %hash = (frogs => sub {print "Frogs\n"}); &{$hash{frogs}}(); 效果一样~ %hash = (frogs => sub {print "Frogs\n"}); $hash{frogs}(); (尽管我最初尝试将其作为&hash{frogs}();期望它可以工作,但结果却是我不明白的错误——符号不应该与哈希中正在访问的事物相对应,在这种情况下&对于子程序?) 所以我想知道为什么这些片段的作者会以另一种方式编写它们,当它是额外的字符时,我可以感觉到没有任何优势。 这里有什么我没有注意到的事情吗? 什么时候可能需要使用花括号而不仅仅是符号? 回答1 你混淆了两个概念。 您需要了解的第一件事是,有两种用于延迟的语法。 Circumfix Postfix "Block syntax" "Arrow syntax" $BLOCK EXPR->$* @BLOCK EXPR->@* $BLOCK[$i] EXPR->[$i] &BLOCK() EXPR->() ... ... 此外,这两种语法都有可用的简化。 您的数组示例是块语法可用的简化示例。
  • 什么时候可以在初始化列表中省略外花括号?(When can outer braces be omitted in an initializer list?)
    问题 编译以下代码时,VC2010中出现错误C2078。 struct A { int foo; double bar; }; std::array<A, 2> a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::array<double, 2> a2 = {0.1, 2.3}; 我发现a1的正确语法是 std::array<A, 2> a1 = {{ {0, 0.1}, {2, 3.4} }}; 问题是:为什么a1不需要多余的括号,而a2却不需要? 更新 这个问题似乎不是特定于std :: array的。 一些例子: struct B { int foo[2]; }; // OK B meow1 = {1,2}; B bark1 = {{1,2}}; struct C { struct { int a, b; } foo; }; // OK C meow2 = {1,2}; C bark2 = {{1,2}}; struct D { struct { int a, b; } foo[2]; }; D meow3 = {{1,2},{3,4}}; // error C2078: too many initializers D bark3 = {{{1,2},{3,4}}}
  • 可以在没有花括号的情况下编写 C# using 语句吗?(Can the C# using statement be written without the curly braces?)
    问题 我今天在浏览同事的 c# 代码,发现以下内容: using (MemoryStream data1 = new MemoryStream()) using (MemoryStream data2 = new MemoryStream()) { // Lots of code.......... } 我一直看到using语句后跟一对定义对象生命范围的花括号。 我编写代码的同事说不需要data1 using语句的大括号,并且代码所做的事情就像它们存在并嵌套data2 using语句一样。 那么,当省略花括号时会发生什么? 回答1 是的,您也可以将它们放在一个 using 语句中: using (MemoryStream data1 = new MemoryStream(), data2 = new MemoryStream()) { // do stuff } 回答2 当您在for或if语句中省略大括号时,同样的规则适用。 顺便说一句,如果您反映到已编译的代码中,编译器反编译器会添加大括号。 回答3 正是他所说的。 上面的代码和写的完全一样: using (MemoryStream data1 = new MemoryStream()) { using (MemoryStream data2 = new MemoryStream()) { // Lots of code } }
  • 使用正则表达式在 JavaScript 中的花括号之间获取内容(Getting content between curly braces in JavaScript with regex)
    问题 我正在尝试使用 JavaScript 获取大括号之间的内容。 我找到了这个线程:正则表达式获取大括号之间的字符串“{我想要大括号之间的内容}” 但我不知道如何应用像/\{([^}]+)\}/这样的正则表达式 我试过string.replace('/\{([^}]+)\}/',''); ,但是这不起作用。 回答1 下面是一个使用示例: var found = [], // an array to collect the strings that are found rxp = /{([^}]+)}/g, str = "a {string} with {curly} braces", curMatch; while( curMatch = rxp.exec( str ) ) { found.push( curMatch[1] ); } console.log( found ); // ["string", "curly"] 回答2 像这样? var x="omg {wtf} bbq"; alert(x.match(/{([^}]+)}/)); 回答3 尝试这个 /[^{\}]+(?=})/g 例如 欢迎使用由 Media Temple 主办的 {gskinner.com}、{ssd.sd} 的 RegExr v2.1! 它将返回“gskinner.com”、“ssd.sd”
  • PHP:$variable{0} 中的花括号有什么作用?(PHP: What do the curly braces in $variable{0} do?)
    问题 我正在浏览代码库并遇到了我有疑问的一行。 这是我以前从未见过的东西,我想知道是否有人可以为我解释一下。 这是代码: $variableName = $array[1]; $variableName{0} = strtolower($variableName{0}); $this->property = $variableName; 花括号是干什么用的? 我以前用花括号将变量定义为变量名,但这是同一回事吗? 我似乎无法在网上找到任何解释它的资源,但我不确定我是否在寻找正确的东西。 回答1 使用该索引{0} => 第一个字符访问单个字节(在非 utf8 字符串中) 你可以简单地测试它: $var='hello'; echo $var{0}; 回答2 它将字符串的第一个字符设置为小写。 这是一个字符串快捷操作符,功能与此相同: <?php $variableName = strtolower(substr($variableName, 0, 1)) . substr($variableName, 1) 回答3 花括号{}与方括号[]的作用相同,用于数组或字符串索引。 我猜它是从 perl 借来的,其中方括号用于数组,大括号用于散列。 但在 PHP 中数组和散列是一回事。
  • array.map() 中大括号的含义 [重复](Meaning of curly braces in array.map() [duplicate])
    问题 这个问题在这里已经有了答案: 箭头函数中的花括号(2 个答案) 去年关闭。 我有一个.map()函数,可以更改data数组中对象的isActive属性值。 然而,用花括号包裹它会返回我未定义,而用括号或不包裹它会返回更新的值。 花括号在箭头函数中用作包装器,但它对 .map() 的工作方式不同吗? const newData = data.map((data) => { data.label === label ? { ...data, isActive: !data.isActive } : data, }); console.log(newData) //undefined const newData = data.map((data) => data.label === label ? { ...data, isActive: !data.isActive } : data, ); console.log(newData) //returns updated newData 回答1 这就是箭头函数的行为。 箭头函数语法被设计得简洁。 (arg) => [single expression] 如果箭头后面是一个没有花括号的单个表达式,则意味着返回该表达式的值。 省略return关键字。 如果大括号跟在箭头后面,那么大括号里面的东西被视为正常的函数体,如果你想返回一个值
  • 如果我在Java中省略花括号可以吗? [关闭](Is it ok if I omit curly braces in Java? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 我已经搜索过此内容,但找不到答案,无论出于什么原因,我都感到羞愧,无法问教授,因为数百人盯着你时的那种感觉…… 无论如何,我的问题是使用方括号的重要性是什么? 如果我省略它们可以吗? 例子: for (int i = 0; i < size; i++) { a += b; } 与 for (int i = 0; i < size; i++) a += b; 我知道它们都可以使用,但是如果省略括号(由于能见度,我倾向于做很多事情)是否会改变任何东西? 正如我所说,我知道它有效,我对其进行了数十次测试,但是现在我的一些单项作业越来越大,出于某种原因,我出于非理性的恐惧,从长远来看,这会引起一些问题吗? 有理由担心吗? 回答1 除了代码的可维护性之外,它根本不会改变任何东西。 我看过这样的代码: for (int i = 0; i < size; i++) a += b; System.out.println("foo"); 这意味着: for (int i = 0; i < size; i++) a += b; System.out.println("foo"); ...但是应该是这样的: for (int i = 0
  • JavaScript regex - 从无限数量的花括号中获取字符串(JavaScript regex - get string from within infinite number of curly braces)
    问题 我正在尝试提取大括号之间的所有文本。 字符串周围可以有任意数量的大括号。 但是,将有相同数量的花括号包裹字符串的每一侧。 var string = "<div>{{foo}}} and {{{bar}}} and {{{{hahahahahahahahaha}}}}</div>" 需要返回 var array = ['foo','bar','hahahahahahahahaha'] 我不能完全理解它... 编辑 一位朋友提供了一个有效的答案: https://regex101.com/r/zI3qL1/1 /\{+(.*?)\}+/g 正如 Christian Rondeau 在评论中指出的那样,这个答案将包括数组中的括号,并且它不会验证括号计数是否匹配。 因此,如果有人对这一难题有有效的答案,我会将其标记为已接受。 发布我自己的答案(一个朋友给我的)并声称它已被接受似乎有点作弊。 回答1 这是使用String.replace的解决方案。 只有当两边的大括号数量匹配时,它才会匹配。 function getParams(input){ var matches = []; input.replace(/(\{+)([^}]+)(}+)/g,function(orig,lb,txt,rb){ if (lb.length === rb.length) matches.push
  • Node.js'require'语句中的花括号(大括号)(Curly brackets (braces) in Node.js 'require' statement)
    问题 我试图理解下面两个“ require”语句之间的区别。 具体来说,将{ }包裹在ipcMain的目的是什么? const electron = require('electron') const {ipcMain} = require('electron') 它们似乎都分配了electron模块的内容,但是显然它们的功能有所不同。 谁能给我一些启示? 回答1 第二个示例使用解构。 这将调用从所需模块导出的特定变量(包括函数)。 例如(functions.js): module.exports = { func1, func2 } 包含在您的文件中: const { func1, func2 } = require('./functions') 现在,您可以单独给他们打电话了, func1() func2() 相对于: const Functions = require('./functions') 用点表示法调用: Functions.func1() Functions.func2() 希望这可以帮助。 您可以在此处了解有关销毁的信息,它是ES6的非常有用的一部分,可以与数组以及对象一起使用。 回答2 使用const electron = require('electron') , ipcMain模块将可作为electron.ipcMain 。 使用const
  • main()周围没有大括号-为什么起作用?(No curly braces around main() — why does this work?)
    问题 我正在研究一本有关C ++的书,并且在有关错误的章节中有此程序(我省略了一些小事情,但主要是这个): int main() try { // our program (<- this comment is literally from the book) return 0; } catch(exception& e) { cerr << "error: " << e.what() << '\n'; return 1; } catch(...) { cerr << "Unknown exception\n"; return 2; } 这个经过编译,但是当然它什么也没做,所以我仍然想知道 为什么在main()之后没有包含所有大括号的花括号? 是块还是应该称它们为main()的“流行语”(ha!)的一部分? 如果它们是函数,为什么在catch之前没有“ int”(无论如何)? 如果它们不是功能,那是什么? 重新捕获(...),我从未见过用这种方式的椭圆。 我可以在任何地方使用省略号来表示“任何东西”吗? 回答1 1为什么在main()之后没有包含所有大括号的花括号? ... 在开始括号之前有一个关键字try ,在main结束之后有一些catch块。 ...是块还是我应该称它们为main()的“流行语”(ha!)的一部分? 2如果它们是函数,那么在catch之前(无论如何)不会有“
  • 函数的 JavaScript 参数中的花括号(Curly braces inside JavaScript arguments for functions)
    问题 函数的 JavaScript 参数周围的花括号有什么作用? var port = chrome.extension.connect({name: "testing"}); port.postMessage({found: (count != undefined)}); 回答1 花括号表示对象字面量。 它是一种发送键/值对数据的方式。 所以这: var obj = {name: "testing"}; 像这样用来访问数据。 obj.name; // gives you "testing" 您可以为对象提供多个逗号分隔的键/值对,只要键是唯一的。 var obj = {name: "testing", another: "some other value", "a-key": "needed quotes because of the hyphen" }; 您还可以使用方括号访问对象的属性。 这在"a-key"的情况下是必需的。 obj["a-key"] // gives you "needed quotes because of the hyphen" 使用方括号,您可以使用存储在变量中的属性名称访问值。 var some_variable = "name"; obj[ some_variable ] // gives you "testing" 回答2 自从提出这个问题以来
  • 为什么有些散列使用花括号初始化,有些使用括号?(Why are some hashes initialized using curly braces, and some with parentheses?)
    问题 我正在查看以下演示嵌套哈希的代码: my %HoH = ( flintstones => { husband => "fred", pal => "barney", }, jetsons => { husband => "george", wife => "jane", "his boy" => "elroy", # Key quotes needed. }, simpsons => { husband => "homer", wife => "marge", kid => "bart", }, ); 为什么最上面的散列(从第 1 行开始)使用括号初始化,而子散列使用花括号初始化? 来自 python 背景,我必须说 Perl 很奇怪:)。 回答1 来自 Perl 背景,我发现 Perl 也很奇怪。 使用括号初始化散列(或数组)。 散列是一组字符串和一组标量值之间的映射。 %foo = ( "key1", "value1", "key2", "value2", ... ); # % means hash %foo = ( key1 => "value1", key2 => "value2", ... ); # same thing 大括号用于定义散列引用。 所有引用都是标量值。 $foo = { key1 => "value1", key2 => "value2", ...
  • Java中的花括号本身是什么意思?(What do curly braces in Java mean by themselves?)
    问题 我有一些以两种方式使用花括号的Java代码 // Curly braces attached to an 'if' statement: if(node.getId() != null) { node.getId().apply(this); } // Curly braces by themselves: { List<PExp> copy = new ArrayList<PExp>(node.getArgs()); for(PExp e : copy) { e.apply(this); } } outAMethodExp(node); 第一个if语句之后的那些独立大括号是什么意思? 回答1 额外括号的唯一目的是提供范围限制。 List<PExp> copy将仅存在于这些花括号内,并且在它们之外将没有作用域。 如果这是生成的代码,则我假设代码生成器会执行此操作,因此它可以插入一些代码(例如此代码),而不必担心它已插入List<PExp> copy ,而不必担心可能会重命名如果此代码段多次插入同一方法中,则为变量。 回答2 我第二次讨论了matt b编写的内容,然后我还将补充说,我看到的匿名括号的另一种用法是在匿名类中声明一个隐式构造函数。 例如: List<String> names = new ArrayList<String>() { // I want to
  • 用匹配的花括号分割字符串的最佳方法(Best ways to split a string with matching curly braces)
    问题 我现在正在C#中工作,并且正在使用JSON.Net将JSON字符串解析为C#对象。 我的问题的部分原因是我得到了一些像这样的字符串: {"name": "John"}{"name": "Joe"} 当我尝试使用JsonConvert.DeserializeObject<>反序列化时,它将引发异常。 我想知道将这个较大的字符串拆分为较小的json字符串的最佳方法是什么。 我正在考虑遍历字符串并匹配“级别0”的花括号。 这似乎是个好主意吗? 还是有一些更好的方法来做到这一点? 回答1 您可以使用将SupportMultipleContent标志设置为true的JsonTextReader来读取此非标准JSON。 假设您有一个Person类,如下所示: class Person { public string Name { get; set; } } 您可以像这样反序列化JSON对象: string json = @"{""name"": ""John""}{""name"": ""Joe""}"; using (StringReader sr = new StringReader(json)) using (JsonTextReader reader = new JsonTextReader(sr)) { reader.SupportMultipleContent = true
  • 为什么在括号上使用花括号?(Why use curly braces over parentheses?)
    问题 在许多 Scala 示例中,我看到人们在我觉得很奇怪的地方使用大括号,因为使用括号可以轻松编写相同的语句。 例子: lst foreach (x => println(s"the value returned is: $x")) // parens lst foreach {x => println(s"you get the idea, $x")} // braces 我知道您可以使用大括号代替括号,因为它允许您在多行上编写语句: val res = for { x <- coll1 y <- coll2 } yield (x, y) 所以当它写在一行上时,是否有任何内在的理由使用一个而不是另一个? 最后结果应该是一样的,还是我遗漏了什么? 或者这仅仅是风格和/或个人品味的问题? 回答1 通常,在很多情况下,您更喜欢花括号(例如,用于推导式的多行表达式),但让我们具体谈谈 当它写在一行上时,是否有任何固有的理由使用一个而不是另一个 在第二种情况下,它不仅仅是花括号,而不是括号,而是带有省略括号的花括号。 Scala 有时允许您省略括号,后面的语法用于访问您在部分函数中获得的细节(即模式匹配),因此 lst foreach {x => println(s"you get the idea, $x")} 实际上是 lst foreach({x => println(s"you
  • 块 - 花括号/没有花括号? [关闭](Blocks - curly braces/no curly braces? [closed])
    问题 就目前而言,这个问题不适合我们的问答形式。 我们希望答案得到事实、参考或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。 如果您觉得这个问题可以改进并可能重新打开,请访问帮助中心以获得指导。 9年前关闭。 当我开始开发时,我遵循的教程总是使用{} (花括号)来包含块。 然而,当我开始查看其他人的代码时(例如 GitHub 上的类,或者只是比基本教程显示的代码更多的一般代码),但是我也看到了没有包含在{}块语句,例如; if($var < 15) $string = 'Hello, Jimmy!'; elseif($var >= 15) $string = 'Hello, Anne!'; 是相同的 if($var < 15) { $string = 'Hello, Jimmy!'; } elseif($var >= 15) { $string = 'Hello, Anne!'; } 我从未使用过未包含在{}块,但是我今天使用了它们并且我开始看到这样做的效率(它看起来也更干净,因为我经常发现我的函数充斥着{}循环、条件等。 我要问的是; a) 没有大括号 (; 我注意到我的 IDE 在输入一行后从缩进中退回并在if()条件后返回的块是否有任何限制? b) 不使用{}时是否有任何最佳实践? 任何答案,特别是那些公司。 关于块的花括号用法与不使用它们的约定的背景
  • 如何在字符串中打印文字大括号字符并在其上使用.format?(How can I print literal curly-brace characters in a string and also use .format on it?)
    问题 x = " \{ Hello \} {0} " print(x.format(42)) 给我: Key Error: Hello\\ 我要打印输出: {Hello} 42 回答1 您需要将{{和}}加倍: >>> x = " {{ Hello }} {0} " >>> print(x.format(42)) ' { Hello } 42 ' 这是Python文档中有关格式字符串语法的相关部分: 格式字符串包含用花括号{}括起来的“替换字段”。 花括号中不包含的所有内容均视为文字文本,该文本原样复制到输出中。 如果需要在文字文本中包含大括号字符,可以通过加倍{{和}}来转义。 回答2 Python 3.6+(2017年) 在最新版本的Python中,将使用f字符串(另请参阅PEP498)。 对于f字符串,应使用双{{或}} n = 42 print(f" {{Hello}} {n} ") 产生所需的 {Hello} 42 如果您需要在方括号中解析表达式而不是使用文字文本,则需要三组方括号: hello = "HELLO" print(f"{{{hello.lower()}}}") 产生 {hello} 回答3 您可以通过将花括号加倍来逃脱它。 例如: x = "{{ Hello }} {0}" print(x.format(42)) 回答4 OP写了这样的评论: