php不是世界上最好的語言, Ruby才是
阿新 • • 發佈:2019-02-19
php是一把好錘子, 很適合0計算機基礎的人入門, 不過這把錘子並不像標準的羊角錘, 一頭拔釘子, 一頭敲釘子. 可能php更像一個兩頭都用來拔釘子的錘子, 別誤會, 我沒有任何貶低php的意思, 我的意思是至少你還可以用這把奇葩的錘子的手柄來敲釘子.
Java不是一把錘子, 而是一個手柄, 你可以在上面接各種工具頭, 敲釘子就接一個錘子頭, 擰螺絲就接個十字刀頭, 問題是你要去找各種工具(對一個Web應用來說, 10多種第三方包不過分吧), 而且手柄本身用起來咯手.
Ruby是一把符合人體工程學設計的手柄, 你依然可以在上面接各種頭. 事實上, Ruby on Rails這個工具頭已經滿足了Web應用的全部需求了.
五大受損 全面解析PHP的糟糕設計
作為Java程式設計師, 鄙人認為反方觀點有理有據讓人信服, 所以今天我們不討論PHP了.
宣告並使用類的例項變數(Ruby勝)
Java
class Foo{
String name;
Foo(String name){
this.name=name;
}
public void printName(){
System.out.print("Hi " + name);
}
}
Ruby
不需要宣告,直接在類的方法中使用@name
class Foo
def initialize(name="World")
@name=name;
end
def say_hi
puts "Hi #{@name}";
end
注意: 建構函式引數name = “World”, Java不支援引數的預設值, 這也是Java專案編譯OK, 執行時經常報NullPointException的原因.
新建類的例項(Ruby勝)
Java
FooFooFooFoo f = new FooFooFooFoo();
Ruby
f = FooFooFooFoo .new()
反射(打平)
Java
Class cla=ReflectionDemo.class; //建立類物件,使用泛型修飾避免強轉
Field[] field=cla.getFields(); //獲取全部公共域(含父類)
Field[] field=cla.getDeclaredFields(); //獲取全部公共域(不含父類)
Method[] method=cla.getMethods(); //獲取全部方法(含父類)
Field[] field2=cla.getDeclaredMethods();//獲取全部方法(不含父類)
Ruby
Foo.instance_variables(true)#列出Foo例項變數(包括父類)
Foo.instance_variables(false)#列出Foo例項變數(不包括父類)
Foo.instance_methods(true) #列出Foo的函式(包括父類)
Foo.instance_methods(false) #列出Foo的函式(不包括父類)
f = Foo.new()
f.respond_to?("foo") #檢查Foo是否有名為name的函式
setter和getter(Ruby勝)
Java
class Foo{
String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
還好? 如果有20個例項變數需要getter和setter呢?
Ruby
class Foo
#attr_accessor自動生成"name", "name="兩個函式. 前者用作getter, 後者用作setter
attr_accessor :name
end
f.respond_to?("name") #true
f.respond_to?("name=") #true