如何在 Ruby 散列中获取值中的键名称以进行打印
How to get the key name inside the value for printing inside a Ruby hash
我正在创建一个散列,其中包含 lambda 作为 Ruby 中的值。我想访问 lambda 中的键名。
散列是匿名函数 (lambdas) 的集合,它们接受输入并执行特定任务。所以,我正在制作一个绘制形状的散列,因此散列中的键是形状名称,如圆形、正方形,这个键的值是一个 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 个这样的键值对。
所需的输出为 marker star has not yet been implemented
一个简单的例子:
HASH = {
key1: ->(x) {
puts('Number of key1 = ' + x.to_s)
}
}
而不是硬编码key1
我想获取值中键的名称,它是一个 lambda,因为散列中有很多 lambda。
将 key1
替换为 #{self}
会打印 class 而不是密钥的名称。
我不认为这是可以做到的。哈希是键和值的集合。键是唯一的,值是 not.You 询问它属于哪个键的值(在这种情况下是一个 lambda,但并不重要)。我可以是一个,none 或很多;无法将值设为 "know"。询问哈希值,而不是值。
您正在尝试 re-implement 在 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!
我正在创建一个散列,其中包含 lambda 作为 Ruby 中的值。我想访问 lambda 中的键名。
散列是匿名函数 (lambdas) 的集合,它们接受输入并执行特定任务。所以,我正在制作一个绘制形状的散列,因此散列中的键是形状名称,如圆形、正方形,这个键的值是一个 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 个这样的键值对。
所需的输出为 marker star has not yet been implemented
一个简单的例子:
HASH = {
key1: ->(x) {
puts('Number of key1 = ' + x.to_s)
}
}
而不是硬编码key1
我想获取值中键的名称,它是一个 lambda,因为散列中有很多 lambda。
将 key1
替换为 #{self}
会打印 class 而不是密钥的名称。
我不认为这是可以做到的。哈希是键和值的集合。键是唯一的,值是 not.You 询问它属于哪个键的值(在这种情况下是一个 lambda,但并不重要)。我可以是一个,none 或很多;无法将值设为 "know"。询问哈希值,而不是值。
您正在尝试 re-implement 在 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!