我目前正在尝试使用Ruby和Rails,我在关于元编程的教程和书籍中有几个部分。许多人提到它是Ruby的重要组成部分,但它们并没有真正详细说明。这就好像元编程是Ruby程序员的最后边界。来自.NET背景我很难理解它为什么会如此有用。
答案 0 :(得分:17)
使用元编程有什么好处?
您可以创建比没有它更具表现力的API(例如,ActiveRecord使用元编程来根据表的列名定义访问器方法,因此您可以编写person.age
之类的内容而不是person.read_attribute("age")
之类的内容,其中person
是一个活动记录对象,而people
表有一个名为age
的列,你可以用比其他方式少得多的代码完成一些事情。
什么是特征类,它与单例有什么不同?
术语“eigenclass”和“singleton class”在ruby的上下文中可互换使用。
在什么情况下使用元编程常见?
在你有其他方法有大量锅炉板代码或创建DSL的情况下。
用例1的例子:
而不是像这样写一些样板代码:
class Foo
def bar
@bar
end
def bar=(b)
@bar = b
end
def baz
@baz
end
def baz=(b)
@baz = b
end
end
您可以使用元编程方法attr_accessor
编写这么短的代码,它会根据您提供的参数自动定义带有名称的getter和setter方法:
class Foo
attr_accessor :foo, :bar
end
如果标准库中不存在attr_accessor
,你可以自己定义它(为了让你知道ruby中的元编程是什么样的):
class Module
def attr_accessor(*variable_names)
variable_names.each do |variable_name|
define_method( variable_name ) do
instance_variable_get( "@#{ variable_name }" )
end
define_method( "#{ variable_name }=" ) do |value|
instance_variable_set( "@#{ variable_name }", value)
end
end
end
端
使用代码修改其他代码的行为有什么道德含义,特别是不属于您自己的代码?
无。
答案 1 :(得分:5)
元编程有时间和地点。我认为它在Ruby书籍中被大量提及,因为人们喜欢炫耀Ruby可以做的其他语言不能做的事情。
元编程就像不知道日语单词中的“汉堡”或“面条汤”,而是知道日语中的“这一个请”(“kore o kudasai”),并且能够指向菜单上的项目。它允许更多的灵活性,但您需要更多的上下文来确切地知道正在做什么。
如果您正在创建ActiveRecord,这允许您执行find_by_foo
,那么元编程是有意义的。
如果您正在编写一个变异测试库,例如zombie-chaser,或者一个测试Ruby的不同实现的特征测试应用程序,例如Small Eigen Collider,则元编程是有意义的。
但是,如果您正在编写应用程序,那么通常不应该是元编程,而只是编程。例如,如果您在应用程序中使用instance_variable_set
,则更多的是代码味道,而不是您的熟练程度。
您可能想要阅读的相关问题包括https://stackoverflow.com/questions/1236191/what-will-i-learn-from-metaprogramming-ruby和Ruby metaprogramming online tutorial以及Metaprogramming how much is too much?。
我真的推荐“Metaprogramming Ruby”这本书,因为它不仅教你元编程,而且教你如何工作。