2017-06-18 70 views
2

我想通過在我的應用程序中創建方法來重新考慮我的代碼。舉例來說,我有以下幾點:代碼重構未定義的方法#<Array:0x00559ec6b7d918> h

@clean_doc = @doc_broken_down_by_lines.reject { |a| a.split.size < 6 } 

我想把

.reject { |a| a.split.size < 6 } 

在一個單獨的功能

我試圖把

def remove_lines_with_less_than_6_words 
    self.break_into_lines.reject { |a| a.split.size < 6 } 
end 

在許多不同的不同位置包括在同一控制器中或處於活動記錄模式並放入

@clean_doc = @doc_broken_down_by_lines.remove_lines_with_less_than_6_words 

,但我得到的錯誤

undefined method `remove_lines_with_less_than_6_words' for #<Array:0x00559ec6b7d918> 

我應該在哪裏把代碼?爲什麼我得到錯誤,而代碼看起來完全相同?謝謝。

回答

2

我應該在哪裏放置代碼?

您需要將您的數組作爲參數的方法,而不是使用它作爲Array實例方法:

def remove_lines_with_less_than_6_words(arr) 
    arr.reject { |a| a.split.size < 6 } 
end 

而且使用這樣的:

@clean_doc = remove_lines_with_less_than_6_words(@doc_broken_down_by_lines) 

然而,你可以在你的控制器(一個私有方法)中添加該方法,並使用@doc_broken_down_by_lines而不將其作爲參數傳遞(因爲作爲實例變量,它將在該類中的所有實例方法中可用):

private 
def remove_lines_with_less_than_6_words 
    @doc_broken_down_by_lines.reject { |a| a.split.size < 6 } 
end 

而且使用這樣的:

@clean_doc = remove_lines_with_less_than_6_words 

爲什麼我得到的錯誤,而該代碼會出現相同?

看上去完全相同,但它根本不相同。使用紅寶石您可以調用實例方法.,因爲rejectArray類中的實例方法,因此可以使用my_array.reject來調用它。

但是,一旦你創建你自己的方法,它不被在Array類中定義的,因此它不能作爲Array實例方法,它是類的一個實例方法,它被定義(如MyControllerMyModel或您決定定義該方法的任何地方)。

這樣算下來my_array.my_custom_method將導致你所得到的錯誤:

未定義的方法`my_custom_method」爲< #Array:...>

相關問題