像这样设置哈希的默认值:
hash = Hash.new { |hsh, key| hsh[key] = {} }
Run Code Online (Sandbox Code Playgroud)
将为未知密钥创建(并分配)新哈希,但将返回nil创建哈希的未知密钥:
hash[:unkown_key] #=> {}
hash[:unkown_key][:nested_unknown] #=> nil
Run Code Online (Sandbox Code Playgroud)
我可以让它适用于第二级,如下所示:
hash = Hash.new do |hsh, key|
hsh[key] = Hash.new { |nest_hsh, nest_key| nest_hsh[nest_key] = {} }
end
Run Code Online (Sandbox Code Playgroud)
但是,它在第三级不起作用:
hash[:unkown_key][:nested_unknown] #=> {}
hash[:unkown_key][:nested_unknown][:third_level] #=> nil
Run Code Online (Sandbox Code Playgroud)
如何让它在任意级别工作?
hash[:unkown_key][:nested_unknown][:third_level][...][:nth_level] #=> {}
Run Code Online (Sandbox Code Playgroud) 我想将常量转换FOO::BAR为 string "BAR"。
这与constantize所做的相反并且非常相似demodulize,除了我期望一个字符串而不是实际的 Module 引用。
我想我可以让我自己的助手来做到这一点,但我无法获得FOO::BAR.
理想情况下,我想避免使用任何 3rd 方宝石。
例子:
class FOO
BAR = {}
end
# this works
FOO #=> FOO
FOO.name #=> "FOO"
# this doesn't
FOO::BAR #=> {}
FOO::BAR.name #=> NoMethodError: undefined method `name' for {}:Hash
Run Code Online (Sandbox Code Playgroud) 我使用number_with_delimiter了在 Ruby on Rails 中为发票中的数字添加逗号的方法。但数字格式造成23,324,455,而不是因为2,33,24,455那就是,印度卢比格式。
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
Run Code Online (Sandbox Code Playgroud)
我必须生成以卢比为单位的发票,因此格式应该是xx,xx,xxx.00. 在 Rails 中可能吗?如何实现?
这可以用 JavaScript 来完成,但问题是,我使用 PDFKit gem 生成了 PDF 格式的发票,它不响应 JavaScript。我在加载文档时使用了所需的 js 代码。
$(document).ready(function(){
$('.totalvalue').each(function(){
value = $('.totalvalue').text();
$('.totalvalue').html(
(value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
)
})
})
Run Code Online (Sandbox Code Playgroud) 我正在尝试缩短此代码:
if a.nil?
a = "foo"
else
a << "foo"
end
Run Code Online (Sandbox Code Playgroud)
a是一个nil或一个字符串.
我已经尝试了a ||= "foo",a += "foo"但如果a是这些则不起作用nil.
我有一个配置文件:
# config/meta.yml
base_meta:
title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)
它有一个相应的初始化器:
# config/meta.yml
base_meta:
title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)
我可以像这样访问标题:
# config/initializers/meta.rb
META = YAML.load_file("#{Rails.root.to_s}/config/meta.yml")
Run Code Online (Sandbox Code Playgroud)
但是,我想国际化我的元数据。我相信这应该由现有的locales/yaml 文件来处理。
如何引用现有的翻译?
# config/locales/en.yml
en:
title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 erb,但它不起作用:
# config/meta.yml
base_meta:
title: t(:title)
Run Code Online (Sandbox Code Playgroud)
将文件重命名为config/meta.yml.erb也没有效果。
有没有办法从我的配置文件中引用 I18n 键?
我找到了其他方法,但是根据ruby文档,这应该可行吗?
p [1,2,3,4].sum
#=> 10
Run Code Online (Sandbox Code Playgroud)
相反,我得到了..
undefined method `sum' for [1, 2, 3, 4]:Array (NoMethodError)
Run Code Online (Sandbox Code Playgroud) 我试图了解一些 Ruby 的内部结构:
尝试使用include类而不是模块会导致TypeError:(这是设计使然的)
class C
end
class Foo
end
Foo.include(C)
#=> TypeError: wrong argument type Class (expected Module)
Run Code Online (Sandbox Code Playgroud)
我想知道类型检查“在幕后”是如何工作的。
由于类是模块,我假设 Ruby 检查参数是否是以下的实际实例Module:
C.is_a?(Module) #=> true
C.instance_of?(Module) #=> false
Run Code Online (Sandbox Code Playgroud)
听起来很合理,不是吗?
但是当我定义自己的Module子类并创建该子类的实例时,它工作得很好:
class Klass < Module
end
K = Klass.new
Foo.include(K)
# no error
Run Code Online (Sandbox Code Playgroud)
但K是 的一个实例Klass,就像C是 的一个实例一样Class。并且Klass是 的子类Module,就像Class:
K.is_a?(Module) #=> true
K.instance_of?(Module) #=> …Run Code Online (Sandbox Code Playgroud) 请考虑以下内容:
{% for variant in product.variants %}
{{ forloop.index }}<br>
{{ unless forloop.last }}LAST<br>{{ endunless }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
根据shopify文档:
如果这是 for 循环的最后一次迭代,则返回 true。如果不是最后一次迭代,则返回 false。
上面代码的输出是:(对于 3 个变体)
1
LAST
2
LAST
3
LAST
Run Code Online (Sandbox Code Playgroud)
为什么?变体对象与上下文中的其他对象不同吗forloop.last?
尝试按多个参数排序,但在一个参数升序排序和另一个参数降序排序时遇到问题。
array = [20, 10, 40, 1200, 300]
Run Code Online (Sandbox Code Playgroud)
我需要首先按每个数字降序的位数对数组进行排序。
所以我们得到 [1200, 120, 40, 10, 20]
如果长度之间存在联系,我需要按值对它们进行升序排序
所以我们得到: [1200, 120, 10, 20, 40]
我正在尝试使 sort_by 为此工作,但我无法弄清楚如何对第一个参数进行降序排序和第二个参数升序排序。
def digit_sorter(ar)
ar.sort_by {|num| [num.to_s.length, num]}.reverse
end
Run Code Online (Sandbox Code Playgroud)
我也试过 [ [num.to_s.length], [num].reverse ]
我正在尝试实现一种方法,如果用户输入一系列零,"00000"它应该返回"0"
否则,如果用户输入例如"00009"或"90000",则输入变量应保持不变。
这个问题有简单的解决方案吗?