小编nic*_*oga的帖子

Elixir:在定义它的同一模块的主体中​​使用宏

这是常见的灵药:

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.

这个"问题"有解决方法吗?有时我可能想使用宏从我正在处理的模块中删除一些样板,并且该宏的功能可能足够具体,不会将其放在另一个模块中.

macros metaprogramming elixir

5
推荐指数
1
解决办法
1259
查看次数

动态地将属性分配给JS对象

我需要动态地向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 获取输入.

javascript jquery json coffeescript

3
推荐指数
1
解决办法
441
查看次数

将数组与自身连接起来

我正在努力实施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)

javascript arrays coffeescript

3
推荐指数
1
解决办法
3369
查看次数

Elixir,默认关键字列表参数

在elixir中可以在函数定义中使用默认参数,但我发现使用单个关键字列表参数不可能这样做:

def do_stuff(
  success: sucess \\ fn(conn) -> conn end,
  error: error
) do
  # ...
end
Run Code Online (Sandbox Code Playgroud)

此外,我想通过使用像JS承诺这样的东西避免这种"回调传递"编码风格,但我找不到Elixir的承诺实现.

也许在语言中内置了一些东西,可以帮助我编写更好的代码,更接近elixir标准.

主要问题:是否可以使用默认关键字参数?

附带问题: Elixir是否提供了一些帮助避免这种"回调传递"的编程风格,而采用更具反应性/可组合性的机制?

elixir promise keyword-argument default-arguments

2
推荐指数
1
解决办法
581
查看次数

Git:如何从单个.git文件夹恢复存储库

我将手放在.git崩溃的GitLab服务器上的文件夹中。我需要从这个单独的.git文件夹中还原此仓库。这可能吗?

git

2
推荐指数
1
解决办法
344
查看次数

ActiveRecord/Postgres:WHERE中不允许聚合函数

我想检索具有许多活动的联系人,其中后者的最大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)

我应该怎么做?

postgresql activerecord ruby-on-rails

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

是否可以转义单词列表印记中的空格?

我正在尝试创建一个包含阿根廷所有省份的原子列表。由于其中一些由多个单词组成,我需要转义空格。

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过使用sigil_wandsigil_W与经典转义序列\\and \\s,但它不起作用。

\n\n
\n

(26 个省份 - 1) * (2 个引号 (") + 1 个逗号 (,) + 1 个可读空格 (" ")) - 我将与印记形式一起使用的 25 个空格 = 我可以保存的 75 个字符

\n
\n\n

我知道我可以使用自定义标志来实现这一点:

\n\n
defmodule MySigil do\n  def sigil_X(string, [])  do\n   string\n   |> String.split(~r/\\s/)\n   |> …
Run Code Online (Sandbox Code Playgroud)

elixir

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