Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 您将如何用Ruby设计这样一个DSL?_Ruby On Rails_Ruby_Dsl - Fatal编程技术网

Ruby on rails 您将如何用Ruby设计这样一个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

我读过Ruby非常适合于领域特定的语言。在过去的几个月里,我一直在制作一款浏览器游戏,一款rpg类型的游戏。在某种程度上,我希望用户能够完成任务。任务可以是任何东西,从杀死x个怪物,杀死一个突袭首领,可能收集一些物品等等

整个过程听起来很有趣,而且容易出错。我还认为,就这一点创建DSL将是一个好主意。用简单的语言描述任务的一种方式。但我在这方面没有太多经验


你认为这是个好主意吗?如果是这样的话,您有什么建议/教程吗?

这里有一个初学者:

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?