(PHP有||和OR。JS只有||。)
JS. 根据MDN || 的优先级高于 =。所以这是行不通的:
a || a = 1;
因为它被评估为:
(a || a) = 1;
这会导致“分配中的左侧无效”。我明白那个。这是有道理的。
PHP。 根据 PHP.net它对 PHP 的作用相同:|| 在 = 之前。但是,我一直使用它:
$a || $a = 1;
为什么它在 PHP 中工作?最重要的是:PHP 的 OR 的优先级低于 =,因此它们不应该做同样的事情:
$a || $a = 1;
$a OR $a = 1;
但他们确实... https://3v4l.org/UWXMd
我认为 JS 的 || 是根据 MDN 的表工作的,而 PHP 的 OR 的工作方式类似于 PHP 的表,但是 PHP 的 || 应该是'不像它那样工作。
这是另一个奇怪的 PHP 怪癖吗?
手册中还提到了这一点:
Although
=has a lower precedence than most other operators, PHP will still allow expressions similar to the following:if (!$a = foo()), in which case the return value offoo()is put into$a.
优先级表指示 PHP 应该计算 (!$a) = foo(),这没有任何意义并且应该失败,但是 PHP 将它计算为 !($a = foo( )),因为它喜欢异常。
后续问题:您认为 if ( $d = $c && $e = $b && $f = $a ) 会怎样? https://3v4l.org/3P2hN我不明白...我确实理解第二种和第三种情况(使用 和 ),只是不理解第一种情况。
最佳答案
根据 zend_language_parser.y代码被解析为等同于 $a || ($a = 1) 和 $a or ($a = 1) 在每种情况下,分别。
正如 melpomene 总结的那样,赋值产生式不是表达式上的中缀二元运算符;相反,赋值运算符是受限产生式,其中左侧必须是变量产生式。
根据 borrowed quote :
Thus PHP parses the expression in the only possible way..
关于优先级的文档正确..它适用。
因此 $a || $a = 1 遵循(反转)产生式:
variable "||" variable "=" expr
variable "||" expr_without_variable
expr "||" expr
expr
!$a = foo() 的情况类似,在遵循(反向)产生式后被解析为 !($a = foo()):
"!" variable "=" expr
"!" expr_without_variable
"!" expr
expr
现在,$d = $c && $e = $b && $f = $a 怎么样?它不被解析为($d = $c) && ..,即使&& 确实有一个优先级高于赋值。它实际上被解析为$d = ($c && ($e = ..)) 等等,由精明的读者完成。
虽然可能不会随便注意到,但这种差异能够产生不同的结果:
$a = (($c = 1) && ($d = 0));
var_dump($a, $c, $d); // => false, 1, 0
$b = ($e = 1 && $f = 0); // => $b = ($e = (1 && ($f = 0)));
var_dump($b, $e, $f); // => false, false, 0
因此,在将赋值运算符与优先级更高的运算符混合使用时,通常应使用括号,尤其是当其结果可能不明确时。
尽管这最初看起来不一致,但它是一个定义明确的语法 - 但技术细节隐藏在一些相当外行的文档之后;并且这些规则与其他类似 C 语法的语言中的规则略有不同。文档中缺少官方 EBNF 也于事无补。
尽管有解析细节,$a || $a = .. 代码( 是有效且定义明确的语法)从评估的角度来看应该保持定义明确,因为“或”的左侧必须出现在由于guaranteed short-circuiting .
相比之下,在 JavaScript 中,a || a = 1 被解析为 (a || a) = 1 - 这在语法上也是“有效”代码 - 根据 ECMAScript Grammar Rules .然而,一个|| a 不会产生有效的引用规范类型,因此会抛出一个运行时 ReferenceError。
关于php - JS 与 PHP : assignment operator precedence when used with logical-or,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672016/
我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE
有几种方法:first_or_create_by、find_or_create_by等,它们的工作原理是:与数据库对话以尝试找到我们想要的东西如果我们找不到,就自己做保存到数据库显然,并发调用这些方法可能会使两个线程都找不到它们想要的东西,并且在第3步中一个线程会意外失败。似乎更好的解决方案是,创建或查找即:提前在您的数据库中创建合理的唯一性约束。如果你想保存一些东西,就保存它如果有效,那就太好了。如果它因为RecordNotUnique异常而无法工作,它已经存在,太好了,加载它那么在什么情况下我想使用Rails内置的东西而不是我自己的(看起来更可靠)create_or_find?
我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User
我在使用FasterCSV和我的rakedb:seeds迁移时遇到问题。我收到错误:“rake中止!未加引号的字段不允许\r或\n(第2行)”在以下seeds.rb数据上:require'csv'directory="db/init_data/"file_name="gardenzing020812.csv"path_to_file=directory+file_nameputs'LoadingPlantrecords'#Pre-loadallPlantrecordsn=0CSV.foreach(path_to_file)do|row|Plant.create!:name=>row[1
可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
怎样说才是明智的呢?if@thing=="01"or"02"or"03"or"04"or"05"(数字包含在数据类型字符串的列中。) 最佳答案 制作数组并使用.include?if["01","02","03","04","05"].include?(@thing)如果值真的都是连续的,你可以使用像(1..5).include?这样的范围对于字符串,你可以使用:if("01".."05").include?(@thing) 关于ruby-优雅的链式'or'用于测试Ruby中的相同变量,我
有一段时间这似乎是一个闪烁的错误,但现在它一直出现:当我在一个相当简单的ApplicationHelper规范上运行RSpec时,我得到以下错误:%rspec--backtrace1)ApplicationHelperrendersMarkdownfromplaintextFailure/Error:expect(helper.md(plaintext)).toeq("Header\n")NameError:undefinedlocalvariableormethod`helper'for##/Users/danielsh/.rvm/gems/ruby-2.1.1@project-st
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每