这是常见的灵药:
defmodule Fizz do
defmacro asdf, do: IO.puts("asdf")
end
defmodule Buzz do
require Fizz
Fizz.asdf
end
Run Code Online (Sandbox Code Playgroud)
但是,尽管您可以在相同的上下文中引用宏,例如:
defmodule Fizz do
# ...
defmacro asdf_qwer, do: asdf && IO.puts("qwer")
end
Run Code Online (Sandbox Code Playgroud)
...您不能在定义它们的同一模块的主体中引用宏:
defmodule Fizz do
defmacro asdf, do: IO.puts("asdf")
asdf
end
Run Code Online (Sandbox Code Playgroud)
这引起了提升undefined function asdf/0.
这个"问题"有解决方法吗?有时我可能想使用宏从我正在处理的模块中删除一些样板,并且该宏的功能可能足够具体,不会将其放在另一个模块中.
我需要动态地向js对象添加属性,这是我通过eval()实现的:
$ ->
#Methods
window.add_address = (attributes, id=new Date().getTime())->
$container = $('ul#addresses_list')
$unit = $('<li>')
$.each attributes, (key,value)->
$input = $('<input type="hidden">')
$input.attr 'name', "contact[addresses_attributes][#{id}][#{key}]"
$input.val value
$unit.append $input
$container.append $unit
#Events
#Add address button
$('a#add_address').on 'click', (ev)->
attributes = new Object
$('#address_fields').find('input').each ->
eval("attributes.#{$(this).attr 'id'}='#{$(this).val()}'");
add_address attributes
Run Code Online (Sandbox Code Playgroud)
这完美的作品,但我觉得别扭用eval(),反正是有这样做"漂亮"?我的意思是,我搜索了像Jquery .serializeArray()这样的替代品,但它似乎只能用查询的形式工作,我需要从该#address_fieldsdiv 获取输入.
我正在努力实施Array.repeat,所以
[3].repeat(4) // yields
=> [3, 3, 3, 3]
Run Code Online (Sandbox Code Playgroud)
......让我发疯
试过这个:
Array::repeat = (num)->
array = new Array
for n in [0..num]
array.concat(this)
array
Run Code Online (Sandbox Code Playgroud)
但[3].repeat(x)总是回归[].在哪里搞砸了?或者有更好的方法吗?
最后结果:
Array::repeat = (num)->
array = new Array
return array if num < 1
for n in [1..num]
array = array.concat(this)
array
['a'].repeat(5)
=> ['a', 'a', 'a', 'a', 'a']
Run Code Online (Sandbox Code Playgroud) 在elixir中可以在函数定义中使用默认参数,但我发现使用单个关键字列表参数不可能这样做:
def do_stuff(
success: sucess \\ fn(conn) -> conn end,
error: error
) do
# ...
end
Run Code Online (Sandbox Code Playgroud)
此外,我想通过使用像JS承诺这样的东西避免这种"回调传递"编码风格,但我找不到Elixir的承诺实现.
也许在语言中内置了一些东西,可以帮助我编写更好的代码,更接近elixir标准.
主要问题:是否可以使用默认关键字参数?
附带问题: Elixir是否提供了一些帮助避免这种"回调传递"的编程风格,而采用更具反应性/可组合性的机制?
我将手放在.git崩溃的GitLab服务器上的文件夹中。我需要从这个单独的.git文件夹中还原此仓库。这可能吗?
我想检索具有许多活动的联系人,其中后者的最大completed_date是6个月前.让我说明一下:
user = User.first
user.contacts.first.activities.maximum(:completed_date)
# SELECT MAX("activities"."completed_date") AS max_id FROM "activities" WHERE "activities"."user_id" = $1 [["user_id", 12]]
=> 2014-03-18 09:06:54 UTC
Run Code Online (Sandbox Code Playgroud)
那很完美.现在我想对WHERE查询使用该子句,但似乎我不能:
user.contacts.joins(:activities)
.where('MAX("activities"."completed_date") < ?', Time.now - 6.months)
# SELECT "contacts".* FROM "contacts"
# INNER JOIN "activities" ON "activities"."contact_id" = "contacts"."id"
# WHERE "contacts"."user_id" = $1 AND (MAX("activities"."completed_date") <= '2013-09-23 05:55:21.191254') [["user_id", 12]]
#=> PG::GroupingError: ERROR: aggregate functions are not allowed in WHERE
# LINE 1: ...ntacts"."id" WHERE "contacts"."user_id" = $1 AND (MAX("activ...
Run Code Online (Sandbox Code Playgroud)
我应该怎么做?
我正在尝试创建一个包含阿根廷所有省份的原子列表。由于其中一些由多个单词组成,我需要转义空格。
\n\n~w[\n Buenos\\sAires\n Capital\\sfederal Catamarca Chaco Chubut Corrientes C\xc3\xb3rdoba\n Entre\\sR\xc3\xados Formosa Jujuy La\\sPampa La\\sRioja Mendoza Misiones Neuqu\xc3\xa9n\n R\xc3\xado\\sNegro Salta San\\sJuan San\\ Luis Santa\\sCruz Santa\\sFe\n Santiago\\sdel\\sEstero Tierra\\sdel\\sFuego Tucum\xc3\xa1n\n]a\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试过使用sigil_wandsigil_W与经典转义序列\\and \\s,但它不起作用。
\n\n\n(26 个省份 - 1) * (2 个引号 (") + 1 个逗号 (,) + 1 个可读空格 (" ")) - 我将与印记形式一起使用的 25 个空格 = 我可以保存的 75 个字符
\n
我知道我可以使用自定义标志来实现这一点:
\n\ndefmodule MySigil do\n def sigil_X(string, []) do\n string\n |> String.split(~r/\\s/)\n |> …Run Code Online (Sandbox Code Playgroud) elixir ×3
coffeescript ×2
javascript ×2
activerecord ×1
arrays ×1
git ×1
jquery ×1
json ×1
macros ×1
postgresql ×1
promise ×1