2010-11-17 50 views
1

下面給出之後的第二部分是從ActiveRecord的代碼片段:: Rails3中的基礎是&&真正需要

def columns 
    unless defined?(@columns) && @columns 
     @columns = connection.columns(table_name, "#{name} Columns") 
     @columns.each { |column| column.primary = column.name == primary_key } 
    end 
    @columns 
    end 

我認爲,我們需要的是

unless defined?(@columns) 

因爲@columns決不會假如它曾經設置過

回答

1

我已經在這個上面來回了,說實話,很難說如果不知道更多關於你的代碼。

如果@columns是否真的很重要,那麼你可能想保持它的方式。

如果@columns可以接受爲nil,則不需要。

0

在文件中之後,有一個方法reset_column_information它設置@columnsnil

def reset_column_information 
    connection.clear_cache! 
    undefine_attribute_methods 
    @column_names = @columns = @columns_hash = @content_columns = @dynamic_methods_hash = @inheritance_column = nil 
    @arel_engine = @relation = @arel_table = nil 
    end 

nil是紅寶石(假值即,既nilfalse將被視爲假爲目的if語句,布爾操作等)。因此,將@columns(和其他所有設置)設置爲nil用作重置所有緩存信息的方式,因此下次有人撥打columns時,它將被重新計算。

因此,您確實需要if語句中的&& @columns子句。如果@columns尚未定義,或者已被重置爲nil,那麼它將計算並緩存列信息。

+0

但是,如果'@ columns'沒有被定義,或者它是'nil',那麼'defined?'會返回'nil',對吧? – Zabba 2010-11-18 07:47:17

+0

@Zabba不,如果'@ columns'設置爲nil,'defined?'不會返回'nil',它會返回''instance-variable「'。 – 2010-11-18 16:27:24

+0

嗯。看起來像tryruby.org導致錯誤信息輸出的問題。在覈磁共振檢查後刪除了我的答案。 – Zabba 2010-11-18 17:02:23