Ruby on rails 您将如何用Ruby设计这样一个DSL?
我读过Ruby非常适合于领域特定的语言。在过去的几个月里,我一直在制作一款浏览器游戏,一款rpg类型的游戏。在某种程度上,我希望用户能够完成任务。任务可以是任何东西,从杀死x个怪物,杀死一个突袭首领,可能收集一些物品等等 整个过程听起来很有趣,而且容易出错。我还认为,就这一点创建DSL将是一个好主意。用简单的语言描述任务的一种方式。但我在这方面没有太多经验Ruby on rails 您将如何用Ruby设计这样一个DSL?,ruby-on-rails,ruby,dsl,Ruby On Rails,Ruby,Dsl,我读过Ruby非常适合于领域特定的语言。在过去的几个月里,我一直在制作一款浏览器游戏,一款rpg类型的游戏。在某种程度上,我希望用户能够完成任务。任务可以是任何东西,从杀死x个怪物,杀死一个突袭首领,可能收集一些物品等等 整个过程听起来很有趣,而且容易出错。我还认为,就这一点创建DSL将是一个好主意。用简单的语言描述任务的一种方式。但我在这方面没有太多经验 你认为这是个好主意吗?如果是这样的话,您有什么建议/教程吗?这里有一个初学者: module RPG def quest put
你认为这是个好主意吗?如果是这样的话,您有什么建议/教程吗?这里有一个初学者:
module RPG
def quest
puts "starting your quest"
yield
end
def move direction
puts "moving to the #{direction.to_s}"
yield if block_given?
end
def door action
puts "#{action.to_s} door"
yield if block_given?
end
end
游戏编写者可以编写以下内容:
require 'rpg'
include RPG
quest do
move :left
move :right
door :open do
move :left
end
end
运行收益率:
> ruby game.rb
starting your quest
moving to the left
moving to the right
opening door
moving to the left
如果您正在设计一个DSL,那么您可能需要花一些时间考虑您试图将该语言映射到的域。DSL有助于消除重复的样板文件,否则您将不得不为每个任务编写样板文件,因此请关注这一点。对于您的任务示例,您认为自己在任务之间需要哪些共同点?显然,很多事情也将取决于任务如何在“幕后”执行 我可以想象这样的任务:
Qwest "Retrieve the Grail" do
given_by :pope
description "Some hethan dragon took my cup, go get it back!"
condition "Slay a dragon" do
dragon.is_dead?
end
condition "Grab the Grail" do
player.inventory.contains :grail
end
reward :phat_loot
end
在这里,DSL可以用来创建一个任务,给它一个名称、条件、奖励,并将其分配给任务给予者
就编写DSL而言,您需要学习ruby中的元编程。我知道为什么“幸运的”斯蒂夫写了一两篇关于它的文章,而《辛酸的指南》有一章是关于它的()。就我个人而言,我总是很难理解为什么要写这些东西。最后我买了,我发现它真的很有用 这两个答案对我都有很大帮助,我会选择两者作为最佳答案。不过我必须选择一本,所以我会选择这本作为元编程书的参考,这本书似乎也是一本不错的参考书。2012年,每个人可能都不需要重新发明元编程并克服同样的障碍。。。也许签出驯服的gem来实现DSL?