1. 程式人生 > >php不是世界上最好的語言, Ruby才是

php不是世界上最好的語言, Ruby才是

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