如果我们知道数据类型并且它不会在运行时更改,我们是否应该定义变量的数据类型或方法的返回类型?有什么利弊或使用def vs实际数据类型?
一个例子是,如果abc是List<String>
List<String> abc = "xyz"; //IntelliJ IDEA gives syntax highlighting for improper assignment
def abc = "xyz"; //IntelliJ IDEA will not give syntax highlighting
答案 0 :(得分:11)
由于方便(特别是来自Java),很容易陷入在任何地方使用def
的陷阱
但是正如你所看到的,如果你知道某种东西的类型,最好输入它,特别是在公共方法上。好处包括;自我记录,ide提示,理智......
答案 1 :(得分:6)
Tim指出,# imports
import requests
from bs4 import BeautifulSoup
from bs4 import NavigableString
# create beautifulsoup object
obce_url = 'http://www.e-obce.sk/zoznam_vsetkych_obci.html?strana=2500'
source_code = requests.get(obce_url)
plain_text = source_code.text
obce_soup = BeautifulSoup(plain_text, 'html.parser')
# define bs filter
def soup_filter_1(tag):
return tag.has_attr('href') and len(tag.attrs) == 1 and isinstance(tag.next_element, NavigableString)
# print settlement names
for tag in obce_soup.find_all(soup_filter_1):
print(tag.string)
不是def
数据类型的别名,但它可以是一个(Object
是一个类虽然Object
只是一个Groovy关键字) - http://www.groovy-lang.org/semantics.html#_variable_definition def
与def
的唯一共同点是,在JVM级别上每个Object
语句或类型替换编译为def
,
考虑非常简单的Object
脚本,其中包含以下内容:
test.groovy
如果您将其编译为def name = "John"
String surname = "Doe"
println "$name $surname"
并查看反编译代码,您将会看到:
test.class
如果您使用支持Groovy的IDE(例如IntelliJ IDEA),那么您应该能够使用类型推断,IDE将为您提供语法支持。
Compiled from "test.groovy"
public class test extends groovy.lang.Script {
public static transient boolean __$stMC;
public test();
LocalVariableTable:
Start Length Slot Name Signature
4 4 0 this Ltest;
public test(groovy.lang.Binding);
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Ltest;
0 9 1 context Lgroovy/lang/Binding;
public static void main(java.lang.String...);
LocalVariableTable:
Start Length Slot Name Signature
0 19 0 args [Ljava/lang/String;
public java.lang.Object run();
LineNumberTable:
line 1: 4
line 3: 9
line 5: 14
LocalVariableTable:
Start Length Slot Name Signature
0 63 0 this Ltest;
7 56 2 name Ljava/lang/Object;
12 51 3 surname Ljava/lang/String;
protected groovy.lang.MetaClass $getStaticMetaClass();
}
关键字 def
的主要目的是在Groovy中引入动态类型。正如您在上面的示例中所看到的,这仍然是旧的Java def
类型。
好的做法是在有意使用静态类型时使用静态类型。出于文档原因,您的公共API绝对应该使用静态类型。我个人在两种情况下不时使用Object
:
def