为啥学习 Ruby 中的元编程和特征类很重要?
Posted
技术标签:
【中文标题】为啥学习 Ruby 中的元编程和特征类很重要?【英文标题】:Why is it important to learn about metaprogramming and eigenclasses in Ruby?为什么学习 Ruby 中的元编程和特征类很重要? 【发布时间】:2011-11-01 17:13:37 【问题描述】:我目前正在尝试使用 Ruby 和 Rails,并且我已经阅读了有关元编程的教程和书籍中的一些部分。许多人提到它是 Ruby 的重要组成部分,但他们并没有真正深入细节。就好像元编程是 Ruby 程序员的最后一道防线。来自 .NET 背景的我很难理解为什么它如此有用。
使用元编程有什么好处? 什么是特征类,它与单例有何不同? 在哪些情况下使用元编程很常见? 使用代码修改其他代码(尤其是不属于您自己的代码)的行为有哪些道德影响?【问题讨论】:
【参考方案1】:使用元编程有什么好处?
与没有它相比,您可以创建更具表现力的 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 我真的很喜欢attr_accessor
的例子,因为它展示了强大的元编程能力的重要好处:元编程使语言本身保持简单。 attr_accessor
很容易成为另一种语言的单独语言构造(相关:C# 中的属性等)。在 Ruby 中,它只是另一种方法。
好答案。虽然 eigenclass 和 singleton class 在 Ruby 中的含义是一样的,但后者现在是首选术语,正如 singleton_class
、singleton_methods
和 define_singleton_method
方法的存在所表明的那样。【参考方案2】:
元编程有时间和地点。我认为它在 Ruby 书籍中被大量提及,因为人们喜欢炫耀 Ruby 可以做其他语言做不到的事情。
元编程就像不知道“汉堡”或“面条汤”的日语单词,但知道“请这个”(“kore o kudasai”)的日语,并且能够指向菜单上的项目.它提供了更大的灵活性,但您需要更多的上下文才能准确了解正在执行的操作。
如果您正在创建 ActiveRecord,它允许您执行 find_by_foo
,那么元编程是有意义的。
如果您正在编写诸如zombie-chaser 之类的变异测试库,或者编写测试不同Ruby 实现的特征测试应用程序(例如Small Eigen Collider),那么元编程就很有意义。
但是,如果您正在编写一个应用程序,那么您通常不应该是元编程,而只是编程。例如,如果您在应用程序中使用 instance_variable_set
,这更像是代码异味,而不是您的熟练程度。
您可能想阅读的相关问题包括 https://***.com/questions/1236191/what-will-i-learn-from-metaprogramming-ruby 和 Ruby metaprogramming online tutorial 和 Metaprogramming how much is too much?。
我真的推荐“元编程 Ruby”这本书,因为它不仅教你元编程,还教你 Ruby 的工作原理。
【讨论】:
以上是关于为啥学习 Ruby 中的元编程和特征类很重要?的主要内容,如果未能解决你的问题,请参考以下文章