class Test{
int p = (p=1) + p; // ERR "Cannot reference a field before it is defined"
int q = (q=1) + this.q; //fine!
void f() {
int t = (t=1) + t; // fine!
}
}
在第一种情况下,我的理解是:当执行赋值(或后续添加?)时,p 被视为未声明。
但为什么它在一个方法内是不同的呢? OK t 不被视为未初始化,因为 (t=1) 在加法之前执行。好的,t 不是一个字段,但目前也没有声明!
我能以某种方式理解它吗?还是我只记住这个区别?
也许这也有点相关:
static int x = Test.x + (x=1) + Test.x; // produces 2
void f() {
int y = y + (y=1) + y; // ERR local variable y may not have been initialized
}
为什么是 2?首先 (x=1) 以某种方式被求值(x 没有被声明!!!),然后它返回 1,现在 x 已经被赋值(!?)并且包含 1,所以两个 Test.x 都是 1,但是(x=1 ) 运算符也返回 1,因此结果应为 1 + 1 + 1 并且 3 应(重新分配)到 x 作为评估 Test.x + (x=1) + Test.x 表达式的结果。
部分答案:实际上,结果是特定于实现的。 JLS 仅保证计算二元运算符的操作数的顺序(从左到右)。但是如果我们有具有相同优先级的二元运算符(例如,加号),则不能保证它们的求值顺序。 在我的例子中,加运算符首先被评估为最左边,这就是为什么 static "int x = Test.x (ZERO) + (x=1) + Test.x (IS 1 after (x=1));"是 0 + 1 + 1(记住,x=1 是一个返回指定值的运算符)。 同样在我的例子中,方法是“int y = y + (y=1) + y;”首先评估最左边的加号运算符(给出错误),但是 如果 JVM 选择首先评估第二个加号运算符,那么它保证首先评估其左操作数并且 (y=1) 将使 y 变量初始化(因此代码会编译!)
我仍然不确定为什么 (x=1) 没有被视为未声明字段。我依稀记得 JLS 允许在 LHS 中使用未声明的变量(因此任何赋值都有效),但在 RHS 中不允许(x++,int sth=x)。我可以使用以下代码片段记住它:
class Test {
{ x = 7; } // fine! Initializer is like a regular method
int x;
static { y = 7; } // fine! Initializer is like a regular method
static int y;
附言这肯定不是 Default Values and Initialization in Java 的副本- 那里没有直接的解释。在这里,我们不仅需要默认值(对于 int 为零)规则,而且需要非常复杂组合中的许多不同规则(运算符优先级,尤其是一些罕见的赋值特性!)。我还知道这里的赋值优先级最低,赋值是一个运算符,它返回值!
最佳答案
阅读 Java Language Specification 中的局部变量声明范围.示例 6.3-2 中描述了您的具体问题。描述是这样的:
以下程序导致编译时错误,因为局部变量p的初始化在局部变量p的声明范围内,但是局部变量p 还没有值,不能使用。
关于java - 为什么 int p = (p=1) + p;字段定义失败但在方法中可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56994255/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢