生成不同的字节码问题(Different byte code generated issue)
我试图在布尔值上进行模式匹配。 我已经编写了相同的方法稍作修改,但它们的字节码生成有很大差异。
例如
scala> def compare(flag: Boolean) = { | flag match{ | case true => println("true..") | case false => println("false...") | }} compare: (flag: Boolean)Unit scala> :javap -c compare Compiled from "<console>" public class $line4.$read$$iw$$iw$ { public static $line4.$read$$iw$$iw$ MODULE$; public static {}; Code: 0: new #2 // class $line4/$read$$iw$$iw$ 3: invokespecial #17 // Method "<init>":()V 6: return public void compare(boolean); Code: 0: iload_1 1: istore_3 2: iconst_1 3: iload_3 4: if_icmpne 22 7: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 10: ldc #27 // String true.. 12: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 15: getstatic #37 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit; 18: astore_2 19: goto 60 22: goto 25 25: iconst_0 26: iload_3 27: if_icmpne 45 30: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 33: ldc #39 // String false... 35: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 38: getstatic #37 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit; 41: astore_2 42: goto 60 45: goto 48 48: new #41 // class scala/MatchError 51: dup 52: iload_3 53: invokestatic #47 // Method scala/runtime/BoxesRunTime.boxToBoolean:(Z)Ljava/lang/Boolean; 56: invokespecial #49 // Method scala/MatchError."<init>":(Ljava/lang/Object;)V 59: athrow 60: return public $line4.$read$$iw$$iw$(); Code: 0: aload_0 1: invokespecial #52 // Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #54 // Field MODULE$:L$line4/$read$$iw$$iw$; 8: return }
当我使用if表达式做同样的事情时,有不同的字节码。
scala> def compareAgain(flag: Boolean) = { | if(flag) println("true..") | else println("false...") | } compareAgain: (flag: Boolean)Unit scala> :javap -c compareAgain Compiled from "<console>" public class $line5.$read$$iw$$iw$ { public static $line5.$read$$iw$$iw$ MODULE$; public static {}; Code: 0: new #2 // class $line5/$read$$iw$$iw$ 3: invokespecial #17 // Method "<init>":()V 6: return public void compareAgain(boolean); Code: 0: iload_1 1: ifeq 15 4: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 7: ldc #27 // String true.. 9: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 12: goto 23 15: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 18: ldc #33 // String false... 20: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 23: return public $line5.$read$$iw$$iw$(); Code: 0: aload_0 1: invokespecial #36 // Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #38 // Field MODULE$:L$line5/$read$$iw$$iw$; 8: return }
有不同的字节码。 这在第一个字节码中意味着什么?
// Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
提前致谢。
I am trying to do a pattern match on the boolean value. I have written the same method with a slight modification but there is much difference in their bytecode generation.
For example
scala> def compare(flag: Boolean) = { | flag match{ | case true => println("true..") | case false => println("false...") | }} compare: (flag: Boolean)Unit scala> :javap -c compare Compiled from "<console>" public class $line4.$read$$iw$$iw$ { public static $line4.$read$$iw$$iw$ MODULE$; public static {}; Code: 0: new #2 // class $line4/$read$$iw$$iw$ 3: invokespecial #17 // Method "<init>":()V 6: return public void compare(boolean); Code: 0: iload_1 1: istore_3 2: iconst_1 3: iload_3 4: if_icmpne 22 7: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 10: ldc #27 // String true.. 12: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 15: getstatic #37 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit; 18: astore_2 19: goto 60 22: goto 25 25: iconst_0 26: iload_3 27: if_icmpne 45 30: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 33: ldc #39 // String false... 35: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 38: getstatic #37 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit; 41: astore_2 42: goto 60 45: goto 48 48: new #41 // class scala/MatchError 51: dup 52: iload_3 53: invokestatic #47 // Method scala/runtime/BoxesRunTime.boxToBoolean:(Z)Ljava/lang/Boolean; 56: invokespecial #49 // Method scala/MatchError."<init>":(Ljava/lang/Object;)V 59: athrow 60: return public $line4.$read$$iw$$iw$(); Code: 0: aload_0 1: invokespecial #52 // Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #54 // Field MODULE$:L$line4/$read$$iw$$iw$; 8: return }
When I do the same thing using if expression, there is different bytecode.
scala> def compareAgain(flag: Boolean) = { | if(flag) println("true..") | else println("false...") | } compareAgain: (flag: Boolean)Unit scala> :javap -c compareAgain Compiled from "<console>" public class $line5.$read$$iw$$iw$ { public static $line5.$read$$iw$$iw$ MODULE$; public static {}; Code: 0: new #2 // class $line5/$read$$iw$$iw$ 3: invokespecial #17 // Method "<init>":()V 6: return public void compareAgain(boolean); Code: 0: iload_1 1: ifeq 15 4: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 7: ldc #27 // String true.. 9: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 12: goto 23 15: getstatic #25 // Field scala/Predef$.MODULE$:Lscala/Predef$; 18: ldc #33 // String false... 20: invokevirtual #31 // Method scala/Predef$.println:(Ljava/lang/Object;)V 23: return public $line5.$read$$iw$$iw$(); Code: 0: aload_0 1: invokespecial #36 // Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #38 // Field MODULE$:L$line5/$read$$iw$$iw$; 8: return }
There is different bytecode. What does this mean in first bytecode?
// Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
Thanks in advance.
原文:https://stackoverflow.com/questions/50510305
最满意答案
您的小数分隔符有问题(默认情况下,R假定为
.
)。 最简单的解决方案可能只是将逗号转换为句点(句号)testDat <- c("0,123","2,13","na") as.double(gsub(",",".",testDat))
由于数据集中的
"na"
值,您仍会收到一些警告; 您可以通过单独转换"na"
值来避免警告,如下所示:NAvals <- testDat=="na" res <- numeric(length(testDat)) res[NAvals] <- NA res[!NAvals] <- as.double(gsub(",",".",testDat[!NAvals]))
可能还有一些方法可以重置您的语言环境(
?Sys.setlocale
),以便它自动运行,但我无法弄明白。这是另一种方法:
scan(text=testDat,dec=",",na.strings="na",quiet=TRUE)
You have a problem with your decimal separators (R assumes
.
by default). The simplest solution is probably just to convert commas to periods (full stops)testDat <- c("0,123","2,13","na") as.double(gsub(",",".",testDat))
You will still get some warnings due to the
"na"
values in your data set; you could avoid the warnings by converting the"na"
values separately, as follows:NAvals <- testDat=="na" res <- numeric(length(testDat)) res[NAvals] <- NA res[!NAvals] <- as.double(gsub(",",".",testDat[!NAvals]))
There may also be some way to reset your locale (
?Sys.setlocale
) so that it works automatically, but I haven't been able to figure it out.Here's another way to do it:
scan(text=testDat,dec=",",na.strings="na",quiet=TRUE)
相关问答
更多-
c()删除属性。 因此,当您创建dates ,时区已被删除,并自动默认为当前的区域设置。 幸运的是,您可以使用structure()并在那里设置时区。 dates <- structure(c(dates2010, dates2011), tzone = "GMT") head(dates) # [1] "2010-06-15 00:00:00 GMT" "2010-06-15 01:00:00 GMT" # [3] "2010-06-15 02:00:00 GMT" "2010-06-15 03:00: ...
-
只需使用floatval() 。 例如: $var = '122.34343'; $float_value_of_var = floatval($var); echo $float_value_of_var; // 122.34343 如果你想知道doubleval()只是一个floatval()的别名。 另一方面,在金融应用中,浮动值是至关重要的,因为这些不够准确。 例如添加两个浮点数可能会导致类似12.30000000001这样的错误可能会传播。 Just use floatval(). E.g.: ...
-
使用suppressWarnings() : suppressWarnings(as.numeric(c("1", "2", "X"))) [1] 1 2 NA 这样可以抑制警告。 Use suppressWarnings(): suppressWarnings(as.numeric(c("1", "2", "X"))) [1] 1 2 NA This suppresses warnings.
-
如何在从字符串转换为逻辑时显式警告会产生NA(How to make warnings explicit when converting from string to logical produces NAs)[2022-01-27]
您可以使用options(warn = 。例如: options(warn=1, error=NULL) 得到警告 我通常通过为代码的相关部分提出错误警告来处理这个问题。 例如: options(warn=2, error=NULL) as.logical(x) 错误:(列表)对象无法强制键入'logical' 你也可以像这个options(warn=0, error=NULL)一样轻松地重置它options(warn=0, error=NULL) 相关: 当R中出现“warnings()”时断开循环 ... -
您需要指定要拆分连接字符串(下面的示例数据中的“var2”)而不是连接为字符串的数值(下面的示例数据中的“var3”)。 这是一个重现错误并显示工作解决方案的示例: df = data.frame(var1 = 1:2, var2 = c("a b c", "a c d"), var3 = c("1 2 3", "1 2 5")) library(splitstackshape) cSplit_e(df, "var3", sep = " ") # var1 var2 var3 var3_1 var ...
-
这似乎是一个取代NA和Inf的非常复杂的方式。 不幸的是,您不会共享任何示例数据,也不会提供有关函数normalize详细信息,所以我不确定数据的外观。 在下面,我假设你有一个matrix或data.frame与numeric ,和一些条目是NA或Inf 。 取而代之的是: # Sample data set.seed(2017); df <- matrix(rnorm(20), ncol = 4); df[2, 2] <- Inf; df[3, 3] <- NA; # Replace NAs and I ...
-
这里有一个使用scan的方法: oneLine <- "IP1: IP2: 0.1,0.5,0.9" myVector <- strsplit(oneLine, ":") listofPValues <- myVector[[1]][[3]] listofPValues # [1] " 0.1,0.5,0.9" scan(text = listofPValues, sep = ",") # Read 3 items # [1] 0.1 0.5 0.9 还有一个使用strsplit : as.numeric ...
-
从评论中看,这似乎是一个数字格式问题。 请尝试以下方法: f = Convert.ToDouble(textBox1.Text, new System.Globalization.CultureInfo("en-US")); From the comments, it looks like it's a number formatting issue. Try the following: f = Convert.ToDouble(textBox1.Text, new System.Globalizati ...
-
您的小数分隔符有问题(默认情况下,R假定为. )。 最简单的解决方案可能只是将逗号转换为句点(句号) testDat <- c("0,123","2,13","na") as.double(gsub(",",".",testDat)) 由于数据集中的"na"值,您仍会收到一些警告; 您可以通过单独转换"na"值来避免警告,如下所示: NAvals <- testDat=="na" res <- numeric(length(testDat)) res[NAvals] <- NA res[!NAvals] ...
-
正如你所说,你应该看看导致错误的原因,可能是数据中的一些“奇怪的数字”。 您可以通过运行转换来完成此操作,然后回顾哪些值生成NA结果。 您应该清楚地看到导致问题的原因。 以下是您的示例数据集,并引入了一个有意识的“时髦数字”。 data <- data.frame( bigNumber = c("552","513","1,512","12-96","1,683","2,172","314","690","923","1,870","602","583","456","760","88","504","47 ...