标签: ruby

这是什么&:最后一个Ruby构造叫做?

可能重复:
map(&:name)在Ruby中意味着什么?

有什么东西survey.map(&:questions).flatten.compact叫做,所以我可以找到更多关于它们的信息:).这&:解决了什么问题,或者它究竟做了什么?它是否用于其他语言?

ruby collections

9
推荐指数
1
解决办法
1476
查看次数

Ruby空格:{:a => 1}比{:a => 1}好吗?

看看其他人的代码,在花括号块中包含一个额外的空间似乎很常见.这有什么理由吗?对我而言似乎增加了额外的击键以增加丑陋.特别是当事物嵌套时:

lambda { (1..5).map { |i| { :a => { :b => i } } } }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它看起来更简洁,更连贯:

lambda {(1..5).map {|i| {:a => {:b => i}}}}
Run Code Online (Sandbox Code Playgroud)

也许额外的空间是一些文本编辑器的副作用或有历史原因或什么?我没有在样式指南中看到这个问题,如果它像2个空格缩进我想遵循惯例,但如果没有充分的理由我想我会继续按照自己的方式做事.你更喜欢哪个?为什么?

ruby formatting whitespace

9
推荐指数
1
解决办法
1834
查看次数

重写简单的ruby函数以使用块

我不知道正确的术语.我试图谷歌它,因为这个原因找不到任何东西.

我正在编写一个Ruby库,我想重写这些函数,因此它们的工作方式如下所示,因为我更喜欢它的可读性(块内?)

我有一个功能,这样做

@dwg = Dwg.new("test.dwg")
@dwg.line([0,0,0],[1,1,0])
@dwg.save
Run Code Online (Sandbox Code Playgroud)

我想重写它,所以它的工作方式就像这样

Dwg.new("test.dwg") do

   line([0,0,0],[1,1,0])
   save

end
Run Code Online (Sandbox Code Playgroud)

你能概括一下我的方式吗?

ruby yield function

9
推荐指数
1
解决办法
503
查看次数

Ruby Watir:在JavaScript提醒上单击确定?

似乎我尝试过的代码都没有任何影响.我的目的是通过点击"确定"按钮关闭可能出现的任何和所有JavaScript提示.问题是,我的脚本对出现的提示没有影响.换句话说,它什么都不做.

这就是我所拥有的:

fx = FireWatir::Firefox.start(somepage)
fx.startClicker("OK")
fx.button(:id, "OK").click
fx.button(:id, "CONFIRM").click
Run Code Online (Sandbox Code Playgroud)

HTML:

<script type="text/javascript">
    alert("Alert!");
    window.confirm("Confirm?");
</script>
Run Code Online (Sandbox Code Playgroud)

提示中的文字可以改变,无论警报/确认提示内部是什么,我的意图是打OK.

PS:我正在运行Ubuntu.

javascript ruby ubuntu watir firewatir

9
推荐指数
1
解决办法
8563
查看次数

Ruby中的普通旧对象?

我注意到在Ruby中,供应商API将结果作为数组传递是很常见的吗?Plain Old Objects(如Java中的POJO)不应该更像标准吗?如果我写自己的库不应该使用POJO PORO?

ruby oop pojo

9
推荐指数
1
解决办法
4786
查看次数

如何将一个分数转换为在ruby中浮动

我有一个字符串,"1/16" 我想将其转换为浮点数并乘以它45.但是,我没有得到预期的结果.

我正在努力 script/console

>> "1/16".to_f
=> 1.0
>> "1/16".to_f*45
=> 45.0
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到理想的结果 2.81

更大的图片:我有这样的下拉:

<%=select_tag :volume, options_for_select(["", "1 g", "1/16 oz", "1/8 oz","1/4 oz",
"1/2 oz", "1 oz", "1/8 lb", "1/4 lb", "Single", "Multi 5" ], "N/A") %>
Run Code Online (Sandbox Code Playgroud)

每当用户选择oz值时,我想将它乘以45

我这样做:

first, *rest = params[:volume].to_s.split(/ /)
if rest.first=="oz"
    @indprodprice = @prods.orig_price.to_i*first.to_f*28.3495
else 
    @indprodprice = @prods.orig_price.to_i*first.to_f*453.59237
end
Run Code Online (Sandbox Code Playgroud)

ruby

9
推荐指数
3
解决办法
5813
查看次数

Ruby的一般分隔输入的优缺点是什么?(语法百分比)

我不明白为什么有些人会在ruby中使用百分比语法.

例如,我正在阅读ruby插件指南,它使用如下代码:

%w{ models controllers }.each do |dir|
  path = File.join(File.dirname(__FILE__), 'app', dir)
  $LOAD_PATH << path
  ActiveSupport::Dependencies.load_paths << path
  ActiveSupport::Dependencies.load_once_paths.delete(path)
end
Run Code Online (Sandbox Code Playgroud)

每当我看到这样的东西时,我都要去查找百分比语法参考,因为我不记得%w的含义.

这种语法真的比较["models", "controllers"].each ...好吗?

我认为在后一种情况下,我更清楚的是我已经定义了一个字符串数组,但在前者中 - 特别是对于学习红宝石的人 - 它似乎并不那么清楚,至少对我而言.

如果有人可以告诉我,我在这里遗漏了一些关键点,那么请这样做,因为我很难理解为什么百分比语法似乎是绝大多数ruby程序员的首选.

ruby syntax

9
推荐指数
1
解决办法
984
查看次数

自定义RESTful资源的url_for(复合键;不仅仅是id)

给定以下资源定义:

map.resources :posts, :except => [:show]
map.post '/:year/:month/:slug, :controller => :posts, :action => :show
Run Code Online (Sandbox Code Playgroud)

我可以url_for使用以下语法为我工作:

<%= link_to @post.title, post_url(:year => '2010', :month => '02', :slug => 'test') %>
Run Code Online (Sandbox Code Playgroud)

但有没有办法让这项工作?

<%= link_to @post.title, @post %>
Run Code Online (Sandbox Code Playgroud)

目前它抛出此错误:

No route matches {:year=>#<Post id: 1, title: "test", (...)>, :controller=>"posts", :action=>"show"}
Run Code Online (Sandbox Code Playgroud)

显然它将@post对象传递给第一个路由参数(看起来像是一个Rails错误...).但我可以为我做这项工作吗?我要补充一点,搞乱default_url_options是一个死胡同.

仅在Rails 3.x中工作的解决方案是可以的,但我不想使用任何插件.

ruby rest ruby-on-rails

9
推荐指数
2
解决办法
4248
查看次数

这个改进的二十一点游戏的最佳获胜策略是什么?

问题

是否有最好的价值,以便我赢得最大比例的游戏?如果是这样,它是什么?

编辑:是否存在可以针对给定限制计算的确切获胜概率,与对手无关?(自大学以来我没有完成概率和统计).我有兴趣将其视为将其与模拟结果进行对比的答案.

编辑:修复了我的算法中的错误,更新了结果表.

背景

我一直在玩一个改进的二十一点游戏,其中一些相当讨厌的规则调整来自标准规则.我将与标准二十一点规则不同的规则用于斜体,并为不熟悉的人提供二十一点规则.

修改过的二十一点规则

  1. 正好两个人类玩家(经销商无关紧要)
  2. 每位玩家面朝下发两张牌
    • 玩家_ever_都不知道对手牌的_any_值
    • 在_both_完成手牌之前,任何一方都不知道对手的牌值
  3. 目标是尽可能接近21分.成果:
    • 如果玩家的A&B得分相同,那么游戏就是平局
    • 如果玩家的A&B都得分超过21(一个半身像),那么游戏就是平局
    • 如果玩家A的得分<= 21并且玩家B已经被击败,则玩家A 获胜
    • 如果玩家A的得分高于玩家B,并且都没有被击败,则玩家A 获胜
    • 否则,玩家A输了(B赢了).
  4. 卡值得:
    • 卡2到10值相应的点数
    • 卡J,Q,K值10分
    • 卡牌王牌价值1或11分
  5. 每位玩家可以一次请求一张额外的牌,直到:
    • 玩家不再需要(留下)
    • 任何A计为1的玩家得分超过21(胸围)
    • 两个玩家都不知道对方在任何时候使用了多少张牌
  6. 一旦两名球员都停留或被击败,获胜者将根据上述规则3确定.
  7. 在每手牌之后整个牌组重新洗牌,所有52张牌再次进场

什么是一副牌?

一副牌由52张牌组成,以下13个值各有四张:

2,3,4,5,6,7,8,9,10,J,Q,K,A

卡的其他财产都不相关.

Ruby的表示形式是:

CARDS = ((2..11).to_a+[10]*3)*4
Run Code Online (Sandbox Code Playgroud)

算法

我一直在接近这个如下:

  • 如果我的分数是2到11,我总是想打,因为它不可能破灭
  • 对于12到21分中的每一个,我将模拟N手对抗对手
    • 对于这N个牌,得分将是我的"限制".一旦达到极限或更高,我会留下来.
    • 我的对手将遵循完全相同的策略
    • 我会模拟N个手的每个排列(12..21),(12..21)
  • 打印每个排列的赢利和亏损差异以及净赢利差异

这是在Ruby中实现的算法:

#!/usr/bin/env ruby
class Array
  def shuffle
    sort_by { rand }
  end

  def shuffle!
    self.replace shuffle
  end

  def score
    sort.each_with_index.inject(0){|s,(c,i)|
      s+c > …
Run Code Online (Sandbox Code Playgroud)

ruby language-agnostic algorithm probability playing-cards

9
推荐指数
1
解决办法
1044
查看次数

Ruby:如何防止通过属性读取器修改数组实例变量

对不起这个菜鸟问题...让我们说:

class TestMe
 attr_reader :array

 def initialize
   @array = (1..10).to_a
 end
Run Code Online (Sandbox Code Playgroud)

结束

然后可以这样做:

>> a = TestMe.new
=> #<TestMe:0x00000005567228 @x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>
>> a.array.map! &:to_s
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
>> a.array
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
Run Code Online (Sandbox Code Playgroud)
  • 这明显违背了封装,不是吗?
  • 有没有办法快速保护数组变量不被改变?
  • ...或者每当我的实例变量具有"破坏性"方法时,我是否需要实现深拷贝读取器?

编辑我在某处读到暴露数组实例变量是"坏OO".如果这是真的,为什么?

ruby arrays getter encapsulation instance-variables

9
推荐指数
2
解决办法
1468
查看次数