Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用lambdas而不依赖条件或枚举数的哈希_Ruby_Hash_Lambda - Fatal编程技术网

Ruby 使用lambdas而不依赖条件或枚举数的哈希

Ruby 使用lambdas而不依赖条件或枚举数的哈希,ruby,hash,lambda,Ruby,Hash,Lambda,如果我有一个类似于这样的列表,包含基本颜色的可接受别名和根名称: coloraliases = { ["red", "crimson", "auburn", "rose", "maroon", "burgundy"] => "red", ["blue", "teal", "aqua", "azure", "cobalt"] => "blue", ["green", "emerald", "absinthe", "avocado", "lime"] => "green

如果我有一个类似于这样的列表,包含基本颜色的可接受别名和根名称:

coloraliases = {
  ["red", "crimson", "auburn", "rose", "maroon", "burgundy"] => "red",
  ["blue", "teal", "aqua", "azure", "cobalt"] => "blue",
  ["green", "emerald", "absinthe", "avocado", "lime"] => "green",
  ["yellow", "banana", "lemon", "gold", "citrine"] => "yellow"
}
我不能这么做:

coloraliases["crimson"]
#=> "red"
我试图这样哄骗这种行为:

basecolor = lambda do |str|
  x = nil
  coloraliases.each do |keys, value|
    if keys.include?(str)
      x = value
      break
    end
  end# of coloraliases hash
  x
end
这应该像预期的那样起作用


我想知道是否有更优雅的方法来做到这一点,特别是不涉及条件块甚至枚举数的方法。三元运算符是好的或更好的,因为它们很紧凑,但仍然不可取,因为它们是条件运算符。

您的哈希设计是错误的。您使用它的方式不应该是散列。应该是:

coloraliases = {
  "red" => "red",
  "crimson" => "red",
  "auburn" => "red",
  "rose" => "red",
  "maroon" => "red",
  "burgundy" => "red",
  "blue" => "blue",
  "teal" => "blue",
  "aqua" => "blue",
  "azure" => "blue",
  "cobalt" => "blue",
  ...
}
然后,你会得到:

coloraliases["crimson"] # => "red"

你的散列设计是错误的。您使用它的方式不应该是散列。应该是:

coloraliases = {
  "red" => "red",
  "crimson" => "red",
  "auburn" => "red",
  "rose" => "red",
  "maroon" => "red",
  "burgundy" => "red",
  "blue" => "blue",
  "teal" => "blue",
  "aqua" => "blue",
  "azure" => "blue",
  "cobalt" => "blue",
  ...
}
然后,你会得到:

coloraliases["crimson"] # => "red"

我所能想到的就是散列选择器模式:这与使用ColorAlias['crimson']非常相似……让每个键单独映射到相应的基色有什么不对?我现在看到@sawa建议在我保存这个之前的几秒钟。我能想到的只是散列选择器模式:这很像做ColorAlias['crimson']…让每个键分别映射到相应的基色有什么不对?我现在看到@sawa在我保存这个之前建议的几秒钟。令人沮丧的简单。谢天谢地简单。谢谢