这个案例语句Ruby的麻烦

时间:2012-06-09 10:43:29

标签: ruby switch-statement

有人可以帮助我理解如何正确地写这个案例陈述它不起作用而作为NOOB我不知道如何解决它:

def hide_link?(link, mailing)
  case link
  when 'edit' &&  ['sent', 'sending', 'archived'].include?(mailing.status)
    return true
  when 'send_schedule' &&  ['sent', 'sending', 'archived'].include?(mailing.status)
    return true
  when 'archive' && ['archived'].include?(mailing.status)
    puts "I should be in here"
    return true
  else 'dashboard' && ['sending', 'draft'].include?(mailing.status)
    return true
  end
end

基本上我想在链接符合某些条件时返回true。

3 个答案:

答案 0 :(得分:3)

我相信如果链接与这些标准不匹配,则该方法应该返回false。因此:

def hide_link?(link, mailing)
  case link
  when 'edit'
    ['sent', 'sending', 'archived'].include?(mailing.status)
  when 'send_schedule'
    ['sent', 'sending', 'archived'].include?(mailing.status)
  when 'archive'
    puts "I should be in here"
    ['archived'].include?(mailing.status)
  when 'dashboard'
    ['sending', 'draft'].include?(mailing.status)
  else
    false
  end
end

构造[...].include?(mailing.status)的结果为truefalse,这些结果将由hide_link?方法返回。

答案 1 :(得分:1)

删除return

link = "fred"
case link
  when "fred"
    true
  else
    false
end

case将返回值本身,然后将其传递给方法。

改造megas的版本:

def hide_link?(link, mailing)
  statuses_to_hide = case link
    when 'edit', 'send_schedule'
      %w{sent sending archived}
    when 'archive'
      %w{archived}
    when 'dashboard'
      %w{sending draft}
    else
      []
    end
  statuses_to_hide.include?(mailing.status)
end

答案 2 :(得分:1)

案例陈述中的条件都遵循相同的形式,这表明有机会消除一些重复,并separate policy from implementation策略是应隐藏链接的一组条件:

WHEN_TO_HIDE_LINK = [
  ['edit', %w(sent sending archived)],
  ['send_schedule', %w(sent sending archived)],
  ['archive', %w(archived)],
  ['dashboard', %w(sending draft)],
]

实现是应用策略的代码:

def hide_link?(link, mailing)
  WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses|
    link_value == link && mailing_statuses.include?(mailing.status)
  end
end

下面的解释。


<强>%重量

%w是一种指定字符串列表而无需键入所有引号和逗号的方法。这样:

%w(sent sending archived)

相当于:

['sent', 'sending', 'archived']

<强>任何吗

Enumerable#any?将数组的每个元素传递给块(doend之间的位)。如果块永远返回 truthy ,那么any?的结果为真;否则,any?的值为false。

数组分解

您是否注意到尽管WHEN_TO_HIDE_LINK的每个元素都是一个数组,但传递给any?的块不会占用数组?你可能希望你必须这样做:

WHEN_TO_HIDE_LINK.any? do |when_to_hide|
  link_value = when_to_hide[0]
  mailing_statuses = when_to_hide[1]
  ...

但Ruby会将数组分解为部分。这是一种方法:

WHEN_TO_HIDE_LINK.any? do |when_to_hide|
  link_value, mailing_statuses = when_to_hide
  ...

当左侧有=右侧和逗号分隔变量的数组时,Ruby会将数组分解为其元素,并将它们分别分配给变量。

但Ruby可以让事情变得更容易:

WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses|
  ...

这相当于前两个片段中的任何一个。

相关问题