Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 将代码块用作父哈希中的值_Ruby - Fatal编程技术网

Ruby 将代码块用作父哈希中的值

Ruby 将代码块用作父哈希中的值,ruby,Ruby,我正在尝试使用一些Ruby魔法重构我的代码(在它是一堆if/elseif语句之前)。但是,当我尝试使用代码块作为散列中的值时,会出现以下错误: syntax error, unexpected '}', expecting tASSOC :restaurant => { Cuisine.all }, 对于下一行和后面的行(:hotel和:attraction)重复此错误 我在这里做错了什么 def moderation_categories(klass) klass_map = {

我正在尝试使用一些Ruby魔法重构我的代码(在它是一堆if/elseif语句之前)。但是,当我尝试使用代码块作为散列中的值时,会出现以下错误:

syntax error, unexpected '}', expecting tASSOC :restaurant => { Cuisine.all },
对于下一行和后面的行(
:hotel
:attraction
)重复此错误

我在这里做错了什么

def moderation_categories(klass) 
  klass_map = {
    :restaurant => { Cuisine.all },
    :hotel      => { Category.where(place_type: "Hotel") },
    :attraction => { Category.where(place_type: "Attraction") }
  }
  list = []
  klass_map[klass.to_sym].call.each { |c| list << c.name }

  list.sort
end
def调节(klass)类别
克拉斯图={
:restaurant=>{carcine.all},
:hotel=>{Category.where(place_type:“hotel”)},
:attraction=>{Category.where(place_type:“attraction”)}
}
列表=[]

klass_映射[klass.to_sym].call.each{c|list块不仅仅作为lambda(代码块)存在。必须将其指定为lambda或Proc

  klass_map = {
    :restaurant => lambda{ Cuisine.all },
    :hotel      => lambda{ Category.where(place_type: "Hotel") },
    :attraction => lambda{ Category.where(place_type: "Attraction") }
  }

块不仅仅是lambda(代码块)。您必须将其指定为lambda或Proc

  klass_map = {
    :restaurant => lambda{ Cuisine.all },
    :hotel      => lambda{ Category.where(place_type: "Hotel") },
    :attraction => lambda{ Category.where(place_type: "Attraction") }
  }

这与您的问题无关,但您的方法的最后三行可以简化为一行:
klass_-map[klass.to_-sym].call.map{c|c.name}.sort
map
方法可以避免手动创建和追加中间
列表
。@ScottOlson真棒,谢谢。这么多Ruby魔法:)没问题。Ruby也比这更神奇!因为
{x|x.method}
原来是一个公共块,所以有一个更短的形式:
klass\u map[klass.to_sym].call.map(&:name).sort
。可以在此处找到该语法的解释:这与您的问题无关,但您的方法的最后三行可以简化为一行:
klass_map[klass.to_sym].call.map{| c | c.name}.sort
map
方法可以避免手动创建和追加中间
列表
。@ScottOlson真棒,谢谢。这么多Ruby魔法:)没问题。Ruby也比这更神奇!因为
{x|x.method}
原来是一个公共块,所以有一个更短的形式:
klass\u map[klass.to_sym].call.map(&:name).sort
。可以在此处找到该语法的解释:或者,
->{…}
。此语法更现代。或者,
->{…}
。此语法更现代。