JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Languages on JVM » Groovy  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 有關Groovy的資料型別的疑問
Ponylin





發文: 38
積分: 0
於 2011-01-09 17:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
各位高手大家好,我其實剛學程式設計還不算很久,約半年,最近對python、javascript、groovy這種程式語言還蠻有興趣的。
於是自己有在玩玩看,可以請問,在程式語言的分類中,動態與靜態(static & dynamic)和強型別/弱型別(strong type & weak type)是怎麼區分的呢? 我有在網路上蒐尋過一些相關的文章,但還是不是很了解,希望高手、老師們可以給我一點方向,謝謝!

像是我剛才練習的一個簡單的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package com.pony.groovy.first
 
class Test {
  def int i ; //型別是int ?
  def String str; //型別是String ?
  def str2;
  
  public Test(int i, String str) {
    super();
    this.i = i;
    this.str = str;
  }
  
  //回傳int型別?
  def int getI() {
    return i;
  }
  
  //回傳Object型別?
  def getStr() {
    return str;
  }
  
  //預設有str2屬性的getter、setter ?
  
  //類似像J2SE的main方法
  static main(args) {
    def i
    for(i = 0; i < 10; i++) {
      print i + ' '
    }
    
    print '\n'
    
    int j = 0;
    while(j < 10) {
      print j +' '
      j++
    }
    
    print '\n'
    
    if(j instanceof Integer) {
      println 'j is-a Integer'
    }
    
    if(i instanceof Object) {
      println "i is-a Object";
    }
    
    if(i instanceof Integer) {
      println 'i is-a Integer';
    }
    
    def t = new Test(10, 'ABCD');
    if(t instanceof Object) {
      println 't is-a Object';
    }
    
    if(t instanceof Integer) {
      println 't is-a Integer';
    } else {
      println 't is not a Integer';
    }
    
    if(t instanceof Test) {
      println 't is-a Test';
      println ('t.i = ' + t.getI() + ' t.str = ' + t.getStr());
    }
    
    if(t.getI() instanceof Integer) {
      println 't.getI() is-a Integer';
    }
    
    if(t.getI() instanceof Object) {
      println 't.getI() is-a Object';
    }
    
    if(t.getStr() instanceof String) {
      println 't.getStr() is-a String';
    }
    
    if(t.getStr() instanceof Object) {
      println 't.getStr() is-a Object';
    }
    
    t.setStr2("This is str2's value... ");
    println t.getStr2();
    
    if(t.getStr2() instanceof Object) {
      println 't.getStr2() is-a Object';
    }
    
    if(t.getStr2() instanceof String) {
      println 't.getStr2() is-a String';
    }
    
    if(t.getStr2() instanceof Integer) {
      println 't.getStr2() is-a Integer';
    } else {
      println 'oh no... t.getStr2() is not a Integer...';
    }
    
  }
 
}


我有點好奇的是,像是javascript也是動態型別的語言,所以他的變數在宣告時,好像不能加上型別的宣告,只能使用關鍵字var,但是為什麼Groovy好像也是動態型別的語言,卻仍然可以宣告型別,也能接受不宣告型別呢?

其實我是想弄懂動態型別和弱型別之間有什麼差別?
非常感謝大家!


Ponylin edited on 2011-01-09 18:00
reply to postreply to post
喜歡自由/前衛爵士樂的Java新手
作者 Re:有關Groovy的資料型別的疑問 [Re:Ponylin]
linuxhsu





發文: 12
積分: 0
於 2011-01-15 09:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
關於 Groovy 的型別標註,我之前有看過一篇文章,裡面的論點是這樣:static typing 的定義,是在程式執行前(編譯時期)就必須確定所有的型別是正確的,而 dynamic typing 是在執行期才檢查資料型別是否正確。

他有舉一個例子:

1
2
3
4
5
6
class Foo {}
class Bar {}
 
Foo test(Bar x) { return x }
println("Everything's groovy")
test(new Bar())


上面這個程式是可以用 groovyc 編譯成功的,可是實際上執行期會發生型別錯誤--證明 groovy 是在執行期才檢查型別,所以 groovy 是 dynamic typing 的程式語言,不論他是不是允許你在程式碼中標註型別。(事實上,如果你把最後一行註解掉,執行時不會發生錯誤)

另外一個反例是 Scala,我之前有寫了一篇文章(靜態型別的動態語言)來說明。從裡面的例子中你可以發現,Scala 允許你在宣告變數的時候不用加上型別(只要他在編譯時期能夠分析出該變數的型別即可),但 Scala 是標準的 static type 的程語語言,可見是否為 static type 並不是由要不要在程式碼中加註型別來判斷的。

至於 weak typing 和 strong typing,其實我也不是很確定有沒有嚴謹的定義,不過一般可以用直覺來分--對資料型別轉換規則比較鬆散的是 weak typing。

舉一個例子:在 Weak typing 的程式語言中,常常會把包含數字的字串當做數值來處理,例如下面的 PHP 程式碼,會自動將 "10" 這個字串當做整數來處理,但在大多數 strong type 的程式中,如果字串這個資料型別沒有定義 / 這個 operator 的話,他會吐出錯誤給你(例如 Java 會在編譯時期抱怨,而 Ruby/Python 會在執行時期爆炸,而這幾個程式語言通常被歸類在 strong type 中)。

1
2
3
4
5
6
7
8
9
<?
$a = "10";
$b = 5;
 
$c = $a * $b;
 
echo $c;
 
?>


reply to postreply to post
blog: http://bone.twbbs.org.tw/blog
plurk: http://plurk.com/brianhsu
作者 Re:有關Groovy的資料型別的疑問 [Re:Ponylin]
ycli6921





發文: 8
積分: 0
於 2011-01-15 18:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
groovy的語法來自java的簡化
編譯器會自動補齊敘述結尾的分號
自動為宣告的field加setter/getter
預設的修飾子為public
可以明確宣告型別 或者編譯器會幫你補一個Object上去
因此假設你的groovy code像這樣
1
2
3
4
5
class Test {
  def method1(arg1){ ... }
  def field1
  String field2  
}

對應到java會類似
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
 
  public Object method1(Object arg1){ ... }
 
  private Object field1;
  public void setField1(Object o){ ... }
  public Object getField1(){ ... }
 
  private String field2;
  public void setField2(String s){ ... }
  public String getField2(){ ... }
}


reply to postreply to post
作者 Re:有關Groovy的資料型別的疑問 [Re:ycli6921]
Ponylin





發文: 38
積分: 0
於 2011-01-21 15:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝你的回答,我稍微有一點點概念了^^"..

reply to postreply to post
喜歡自由/前衛爵士樂的Java新手
» JWorld@TW »  Languages on JVM » Groovy

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8