簡體   English   中英

我將如何重構此代碼以使用proc?

[英]How would I refactor this code to use procs?

原始代碼:

  def self.user_admin_links
    ADMIN_PAGES.inject([]) do |result, page|
      result << Page.new(controller: page[:name]) if page[:menu] && (page[:group_admin] || page[:company_admin])
      result
    end
  end

  def self.super_admin_links
    ADMIN_PAGES.inject([]) do |result, page|
      result << Page.new(controller: page[:name]) if page[:super_admin]
      result
    end
  end

我試圖像這樣重構:

array_builder = Proc.new do |conditional|
    ADMIN_PAGES.inject([]) do |result, page|
      result << Page.new(controller: page[:name]) if conditional
      result
    end
  end

  def self.user_admin_links
    array_builder.call(page[:menu] && (page[:group_admin] || page[:company_admin]))
  end

  def self.super_admin_links
    array_builder.call(page[:super_admin])
  end

但是我得到這個錯誤:

Error: undefined local variable or method `array_builder' for Page:Class.

當我將array_builder變成一個類方法時,如下所示:

  def self.array_builder 
    Proc.new do |conditional|
      ADMIN_PAGES.inject([]) do |result, hsh|
        result << Page.new(controller: hsh[:name]) if conditional
        result
      end
    end
  end

我收到一個錯誤,在self.user_admin_links方法中無法識別“頁面”。

在Ruby中,方法不是閉包。 即,它們不能使用周圍范圍的局部變量,例如array_builder

而且,如果您希望針對ADMIN_PAGES每個元素對page進行評估,則應使用一個塊參數(基本上只是將proc作為參數傳遞的某種語法)。 否則,將僅在未定義pagelinks方法中對它進行一次評估。

def array_builder &conditional
  ADMIN_PAGES.inject([]) do |result, page|
    result << Page.new(controller: page[:name]) if conditional[page]
    result
  end
end

另外,這是一個更好的Ruby習慣用法。 使用Enumerable#selectEnumerable#map而不是手動推送到數組並使用inject:

def array_builder &conditional
  ADMIN_PAGES.select(&conditional).map {|page| Page.new(controller: page[:name])}
end

然后,其他方法傳遞一個塊:

def self.user_admin_links
  array_builder {|page| page[:menu] && (page[:group_admin] || page[:company_admin])}
end

def self.super_admin_links
  array_builder {|page| page[:super_admin]}
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM