我和一位同事就在if中分配变量的最佳方式进行了争论..否则就封锁.他的原始代码是:

@products = if params[:category]
  Category.find(params[:category]).products
else
  Product.all
end

我这样重写:

if params[:category]
  @products = Category.find(params[:category]).products
else
  @products = Product.all
end

这也可以使用ternery操作符(?:)用一行重写,但让我们假设产品分配长度超过100个字符,不能放在一行中.

这两者中哪一个对你来说更清楚?第一个解决方案占用的空间少了一点,但我认为声明一个变量并在三行之后分配它可能更容易出错.我也喜欢看到我的ifelse对齐,这让我的大脑更容易解析它!

推荐答案

作为badp's answer中语法的替代方案,我想提出:

@products = 
  if params[:category]
    Category.find(params[:category]).products
  else
    Product.all
  end

我认为这有两个好处:

  1. Uniform indentation:逻辑嵌套的每一级都缩进正好两个空格(好吧,也许这只是品味的问题)
  2. Horizontal compactness:更长的变量名不会将缩进的代码推过80(或任何)列标记

它确实需要额外的一行代码,这通常是我不喜欢的,但在这种情况下,用垂直极简主义来交换水平极简主义似乎是值得的.

Disclaimer:这是我自己独特的方法,我不知道它在Ruby社区的其他地方被使用到了什么程度.

Edit:我应该提到的是,matsadler's answer也和这个相似.我确实认为有some个缩进是有帮助的.我希望这足以证明这是一个单独的答案.

Ruby相关问答推荐

Ruby 中无法解释的撬动行为

数组到哈希:字数

如何使用 Ruby 删除字符串中某个字符后的子字符串?

define_method:如何动态创建带参数的方法

检测 ruby​​ 是否在 Windows 上运行的正确方法是什么?

使用 Ruby MiniTest 之前/之后的套件

将方法应用于数组/可枚举中的每个元素

在文件中搜索字符串的最佳方法是什么?

Ruby 1.9 - 无效的多字节字符(US-ASCII)

. vs ::(点与双冒号)用于调用方法

ruby module_function 与包含模块

Ruby:将字符串转换为日期

判断是否在 SASS 中定义了变量

如何只获取没有命名空间的类名

是否有更简单的(单行)语法来别名一个类方法?

很好地格式化输出到控制台,指定选项卡的数量

如何在 Ruby 中取消定义类?

Ruby 中的自然语言处理

遍历数组的前 n 个元素

Ruby:是否可以在模块中定义类方法?