Ruby 我如何编写惰性转换语句?
很长一段时间以来,我拼命地想让它发挥作用,我在谷歌上搜索、修补,并询问了一些当地的红宝石专家(虽然不是pdx.rb,但我真的应该这样做) 我们试图在工作中做类似的事情:Ruby 我如何编写惰性转换语句?,ruby,Ruby,很长一段时间以来,我拼命地想让它发挥作用,我在谷歌上搜索、修补,并询问了一些当地的红宝石专家(虽然不是pdx.rb,但我真的应该这样做) 我们试图在工作中做类似的事情: case user.roles.included? (... magic ...) when ['admin', 'editor'] then ... when ['anonymous'] then ... end 因此,您可以看到它感觉像是一个案例,但因为它没有使用El提到的==,所以它不起作用。我知道我可以使
case user.roles.included? (... magic ...)
when ['admin', 'editor']
then ...
when ['anonymous']
then ...
end
因此,您可以看到它感觉像是一个案例
,但因为它没有使用El提到的==
,所以它不起作用。我知道我可以使用if
,但它感觉像是一个应该使用case
的地方
case
when x == 16
puts 'hi'
when x.is_a?(Object)
puts 'obj'
end
如果我真的理解了这个问题,您只需要删除case
关键字后面的x
变量
lambda代码不起作用,因为lambda只返回参数
names_l.call(names)
# => {:name => 'Terry'}
这类似于运行以下代码:
case {:name => 'Terry'}
when 'Terry'
puts "Success!"
end
而且{:name=>'Terry'}
不等于'Terry'
如果我真的理解了这个问题,您只需要删除case
关键字后面的x
变量
lambda代码不起作用,因为lambda只返回参数
names_l.call(names)
# => {:name => 'Terry'}
这类似于运行以下代码:
case {:name => 'Terry'}
when 'Terry'
puts "Success!"
end
而
{:name=>'Terry'}
不等于'Terry'
当
使用==
运算符将给定给case
的值与给定给的参数进行比较时。另外,如果出现在与when
语句不同的行上,则不需要那么正确的代码是:
case x
when 16
puts 'hi'
when Object
puts 'obj'
end
关于问题的新增内容:
case user.roles.included? (... magic ...)
when ['admin', 'editor']
...
when ['anonymous']
...
end
这不起作用,因为数组的==
没有映射到包含。我不确定数组的===
运算符来自何处,甚至不知道它的作用,但您可以覆盖它以提供所需的功能
根据以上代码判断,如果其中一个用户角色与数组匹配,则希望触发案例。这将覆盖数组#==
以执行以下操作:
class Array
def === other_array
! (other_array & self).empty?
end
end
case user.roles
when ['admin', 'editor']
...
when ['anonymous']
...
end
警告:取决于覆盖数组的位置#==
这可能会产生不可预见的后果,因为它会更改该范围内的所有数组。鉴于==
是从对象继承的,而该对象是==
的别名,我不认为这会是一个大问题
新的===
与旧的===
不同的地方:
- 如果一个数组是另一个数组的子集或重新排序,则New
==
将返回true
- 只有当两个数组(顺序和内容)相同时,Old
==
才会返回true
据我所知,case
/when
是唯一可以对数组隐式调用==
的时间。when
使用==
操作符将case
的值与when
的参数进行比较。另外,如果出现在与when
语句不同的行上,则不需要那么正确的代码是:
case x
when 16
puts 'hi'
when Object
puts 'obj'
end
关于问题的新增内容:
case user.roles.included? (... magic ...)
when ['admin', 'editor']
...
when ['anonymous']
...
end
这不起作用,因为数组的==
没有映射到包含。我不确定数组的===
运算符来自何处,甚至不知道它的作用,但您可以覆盖它以提供所需的功能
根据以上代码判断,如果其中一个用户角色与数组匹配,则希望触发案例。这将覆盖数组#==
以执行以下操作:
class Array
def === other_array
! (other_array & self).empty?
end
end
case user.roles
when ['admin', 'editor']
...
when ['anonymous']
...
end
警告:取决于覆盖数组的位置#==
这可能会产生不可预见的后果,因为它会更改该范围内的所有数组。鉴于==
是从对象继承的,而该对象是==
的别名,我不认为这会是一个大问题
新的===
与旧的===
不同的地方:
- 如果一个数组是另一个数组的子集或重新排序,则New
==
将返回true
- 只有当两个数组(顺序和内容)相同时,Old
==
才会返回true
据我所知,case
/当是唯一一次可以对数组隐式调用=
。哈,这是我问题的一半。我没想到会这么容易。我将试图澄清我的问题的其余部分。也许我能找到引起我问题的旧代码。找不到代码,我在错误的机器上。但我会告诉你情况。我们在rails中创建了一个命名范围,需要根据登录用户的角色采取不同的行动。因此,案例需要一个函数,而当需要是一个数组时。本质上我是这样想的(伪代码):case user.roles.included?(…magic…)当['admin','editor']当['anonymous']结束时,我们最终使用了一个函数,但这仍然困扰着我。如何获取案例中要评估的when部分?或者这只是错误的逻辑,必须用函数来完成?好的,注释中没有代码。希望你明白我的意思。你对lambda的解释是正确的,但是你的案例代码为我抛出了missing-then错误。我在irb中针对Ruby 1.8.6、1.8.7和1.9.1测试了该语句,但没有得到任何错误消息那么关键字不需要换行。哈,这是我问题的一半。我没想到会这么容易。我将试图澄清我的问题的其余部分。也许我能找到引起我问题的旧代码。找不到代码,我在错误的机器上。但我会告诉你情况。我们在rails中创建了一个命名范围,需要根据登录用户的角色采取不同的行动。因此,案例需要一个函数,而当需要是一个数组时。本质上我是这样想的(伪代码):case user.roles.included?(…magic…)当['admin','editor']当['anonymous']结束时,我们最终使用了一个函数,但这仍然存在