如何在Ruby散列中获取打印值中的键名
我正在创建一个散列,其中包含lambdas作为Ruby中的值。我想访问lambda中的密钥名 散列是匿名函数(lambda)的集合,这些函数接受输入并执行特定任务。我在做一个散列,它画了一个形状,散列中的键是形状名称,比如圆,正方形,这个键的值是一个lambda,它接受输入并执行一些任务,从而画出形状。 所以,这里我想在lambda中打印形状的名称,即键 真正的例子是:如何在Ruby散列中获取打印值中的键名,ruby,lambda,ruby-hash,Ruby,Lambda,Ruby Hash,我正在创建一个散列,其中包含lambdas作为Ruby中的值。我想访问lambda中的密钥名 散列是匿名函数(lambda)的集合,这些函数接受输入并执行特定任务。我在做一个散列,它画了一个形状,散列中的键是形状名称,比如圆,正方形,这个键的值是一个lambda,它接受输入并执行一些任务,从而画出形状。 所以,这里我想在lambda中打印形状的名称,即键 真正的例子是: MARKER_TYPES = { # Default type is circle # Str
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列表,这看起来也不错,但我想避免创建一个新类,从而避免散列。谢谢你的建议!