如何在Ruby散列中获取打印值中的键名

如何在Ruby散列中获取打印值中的键名,ruby,lambda,ruby-hash,Ruby,Lambda,Ruby Hash,我正在创建一个散列,其中包含lambdas作为Ruby中的值。我想访问lambda中的密钥名 散列是匿名函数(lambda)的集合,这些函数接受输入并执行特定任务。我在做一个散列,它画了一个形状,散列中的键是形状名称,比如圆,正方形,这个键的值是一个lambda,它接受输入并执行一些任务,从而画出形状。 所以,这里我想在lambda中打印形状的名称,即键 真正的例子是: MARKER_TYPES = { # Default type is circle # Str

我正在创建一个散列,其中包含lambdas作为Ruby中的值。我想访问lambda中的密钥名

散列是匿名函数(lambda)的集合,这些函数接受输入并执行特定任务。我在做一个散列,它画了一个形状,散列中的键是形状名称,比如圆,正方形,这个键的值是一个lambda,它接受输入并执行一些任务,从而画出形状。 所以,这里我想在lambda中打印形状的名称,即键

真正的例子是:

MARKER_TYPES = {
        # Default type is circle
        # Stroke width is set to 1
        nil: ->(draw, x, y, fill_color, border_color, size) {
          draw.stroke Rubyplot::Color::COLOR_INDEX[border_color]
          draw.fill Rubyplot::Color::COLOR_INDEX[fill_color]
          draw.circle(x,y, x + size,y)
        },
        circle: ->(draw, x, y, fill_color, border_color, size) {
          draw.stroke Rubyplot::Color::COLOR_INDEX[border_color]
          draw.fill Rubyplot::Color::COLOR_INDEX[fill_color]
          draw.circle(x,y, x + size,y)
        },
        plus: ->(draw, x, y, fill_color, border_color, size) {
          # size is length of one line
          draw.stroke Rubyplot::Color::COLOR_INDEX[fill_color]
          draw.line(x - size/2, y, x + size/2, y)
          draw.line(x, y - size/2, x, y + size/2)
        },
        dot: ->(draw, x, y, fill_color, border_color, size) {
          # Dot is a circle of size 5 pixels
          # size is kept 5 to make it visible, ideally it should be 1
          # which is the smallest displayable size
          draw.fill Rubyplot::Color::COLOR_INDEX[fill_color]
          draw.circle(x,y, x + 5,y)
        },
        asterisk: ->(draw, x, y, fill_color, border_color, size) {
          # Looks like a five sided star
          raise NotImplementedError, "marker #{self} has not yet been implemented"
        }
}
散列包含大约40个这样的键、值对

这将是
标记星的预期输出,但尚未实现

一个简单的例子:

HASH = {
  key1: ->(x) {
   puts('Number of key1 = ' + x.to_s) 
  }
}
我不想硬编码
key1
而是想得到值中的键名,该值是lambda,因为散列中有很多lambda


key1
替换为
{self}
将打印类而不是键的名称。

我认为这是不可能的。散列是键和值的集合。键是唯一的,值不是唯一的。您正在询问一个值(在本例中是lambda,但这并不重要),它属于哪个键。我可以是一个,一个也可以是多个;没有办法让价值“知道”。询问哈希值,而不是值。

您试图在Ruby中重新实现面向对象编程。没有必要,一切都是Ruby中的对象

您可以删除所有重复的代码、lambda和复杂的哈希逻辑:

class MarkerType
  attr_reader :name
  def initialize(name, &block)
    @name = name
    @block = block
  end

  def draw(*params)
    if @block
      @block.call(*params)
    else
      puts "Marker #{name} has not been implemented yet!"
    end
  end
end

square = MarkerType.new 'square' do |size=5|
  puts "Draw a square with size : #{size}"
end

square.draw
# => Draw a square with size : 5


asterisk = MarkerType.new 'asterisk'
asterisk.draw
# => Marker asterisk has not been implemented yet!

我懂了。不,哈希值不知道它的键名是什么。散列是如何创建的?您可以通过迭代散列来获取密钥名,例如
hash.each do | key,val |
。你能展示一下这个的全部用途吗?你在哪里调用lambas?编辑了这个问题,如果仍然不清楚,请告诉我。你在问题中说,“散列中有很多lamda”。您在示例中只显示了一个。了解如何区分它们会很有帮助。另外,您还没有回答我关于如何创建哈希的问题。它是手动完成的还是生成的?根据你的想法,也许散列真的不是你最终想要做的事情的正确表示?最终了解你想要达到的目标会有所帮助。在回答问题时,我们会遇到许多XY问题,你问的是Y,但应该问的是X。“也许最好描述一下意图;你想做什么,为什么要这样做?另外,请参阅“”和链接页以及“”,因为它们将帮助您更好地定义问题。哈希可以反转为数组哈希,以便根据值进行查找,但也可以获得可能的lambda列表,这看起来也不错,但我想避免创建一个新类,从而避免散列。谢谢你的建议!