在 Ruby 中,如何引用模块中定义的 lambda?
In Ruby, how can I reference a lambda defined in a module?
在我将 lambda 函数放入模块之前,这段代码一直有效。
这是 lambda 函数:
module GalleryGenerator
@add_links_to_descriptions = lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
#...
end
使用方法如下:
include GalleryGenerator
gallery = ViewableGallery.new(gallery_config.title, gallery_config.description, gallery_config.slug, \
gallery_config.sources, gallery_config.upload_date, gallery_config.map_url, gallery_config.map_title, \
gallery_config.year, viewable_photos).
update_using( \
add_tabs_before_every_description_line(2), \
@add_links_to_descriptions)
那是错误:
/home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:26:in `block in update_using': undefined method `call' for nil:NilClass (NoMethodError)
from /home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:25:in `each'
from /home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:25:in `update_using'
from bin/gallery_generator:32:in `<main>'
如果 lambda 消息不在模块中,一切正常。我怀疑它在错误的地方寻找 @add_links_to_descriptions 现在在模块中...
我该如何解决这个问题?谢谢!
试试这个:
module GalleryGenerator
def self.add_links_to_descriptions
lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
end
#...
end
并用 GalleryGenerator.add_links_to_descriptions
调用它
只需将 lambda
设为返回 lambda 的常量或实例方法即可。
module GalleryGenerator
LINKS_TO_DESCRIPTION_ADDER = lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
#...
end
update_using( \
add_tabs_before_every_description_line(2), \
LINKS_TO_DESCRIPTION_ADDER)
在 Ruby 中,名称以 @
符号开头的变量是 实例变量 ,即属于特定 的变量对象(或实例)。
在这种情况下,实例变量@add_links_to_descriptions
属于常量GalleryGenerator
所引用的对象,并且只能被它访问,不能被其他对象访问。
Ruby 中的其他对象唯一可以访问的是方法。所以,你需要定义一个方法,其中returns实例变量的值。这种方法在 Ruby 中称为 属性 reader,并且有一个方便的方法可以自动生成它们,称为 Module#attr_reader
:
class << GalleryGenerator
attr_reader :add_links_to_descriptions
end
class Foo
GalleryGenerator.add_links_to_descriptions.(nil)
end
或者,您可以使用常量而不是实例变量。常量用大写字母表示:
module GalleryGenerator
AddLinksToDescriptions = -> mutable_viewable_content {
mutable_viewable_content.tap do |m|
m.description = add_links_to_sources(m.description)
end
}
end
class Foo
GalleryGenerator::AddLinksToDescriptions.(nil)
end
或者,您冷使用 class 层次结构变量(由 @@
标记表示):
module GalleryGenerator
@@add_links_to_descriptions = -> mutable_viewable_content {
mutable_viewable_content.tap do |m|
m.description = add_links_to_sources(m.description)
end
}
end
class Foo
include GalleryGenerator
@@add_links_to_descriptions.(nil)
end
在我将 lambda 函数放入模块之前,这段代码一直有效。
这是 lambda 函数:
module GalleryGenerator
@add_links_to_descriptions = lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
#...
end
使用方法如下:
include GalleryGenerator
gallery = ViewableGallery.new(gallery_config.title, gallery_config.description, gallery_config.slug, \
gallery_config.sources, gallery_config.upload_date, gallery_config.map_url, gallery_config.map_title, \
gallery_config.year, viewable_photos).
update_using( \
add_tabs_before_every_description_line(2), \
@add_links_to_descriptions)
那是错误:
/home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:26:in `block in update_using': undefined method `call' for nil:NilClass (NoMethodError)
from /home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:25:in `each'
from /home/mike/Development/Projects/FT/gallery_generator/lib/gallery_generator/viewable_gallery.rb:25:in `update_using'
from bin/gallery_generator:32:in `<main>'
如果 lambda 消息不在模块中,一切正常。我怀疑它在错误的地方寻找 @add_links_to_descriptions 现在在模块中...
我该如何解决这个问题?谢谢!
试试这个:
module GalleryGenerator
def self.add_links_to_descriptions
lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
end
#...
end
并用 GalleryGenerator.add_links_to_descriptions
只需将 lambda
设为返回 lambda 的常量或实例方法即可。
module GalleryGenerator
LINKS_TO_DESCRIPTION_ADDER = lambda do |mutable_viewable_content|
mutable_viewable_content.description = add_links_to_sources(mutable_viewable_content.description)
return mutable_viewable_content
end
#...
end
update_using( \
add_tabs_before_every_description_line(2), \
LINKS_TO_DESCRIPTION_ADDER)
在 Ruby 中,名称以 @
符号开头的变量是 实例变量 ,即属于特定 的变量对象(或实例)。
在这种情况下,实例变量@add_links_to_descriptions
属于常量GalleryGenerator
所引用的对象,并且只能被它访问,不能被其他对象访问。
Ruby 中的其他对象唯一可以访问的是方法。所以,你需要定义一个方法,其中returns实例变量的值。这种方法在 Ruby 中称为 属性 reader,并且有一个方便的方法可以自动生成它们,称为 Module#attr_reader
:
class << GalleryGenerator
attr_reader :add_links_to_descriptions
end
class Foo
GalleryGenerator.add_links_to_descriptions.(nil)
end
或者,您可以使用常量而不是实例变量。常量用大写字母表示:
module GalleryGenerator
AddLinksToDescriptions = -> mutable_viewable_content {
mutable_viewable_content.tap do |m|
m.description = add_links_to_sources(m.description)
end
}
end
class Foo
GalleryGenerator::AddLinksToDescriptions.(nil)
end
或者,您冷使用 class 层次结构变量(由 @@
标记表示):
module GalleryGenerator
@@add_links_to_descriptions = -> mutable_viewable_content {
mutable_viewable_content.tap do |m|
m.description = add_links_to_sources(m.description)
end
}
end
class Foo
include GalleryGenerator
@@add_links_to_descriptions.(nil)
end