Elixir 如何使用函数参数作为键从映射中获取值 def mapdna(dna)do dnarna=%{“G”=>“C”、“C”=>“G”、“T”=>“A”、“A”=>“U”} 德纳纳[脱氧核糖核酸] 结束

Elixir 如何使用函数参数作为键从映射中获取值 def mapdna(dna)do dnarna=%{“G”=>“C”、“C”=>“G”、“T”=>“A”、“A”=>“U”} 德纳纳[脱氧核糖核酸] 结束,elixir,Elixir,当我将“G”传递给mapdna时,它应该返回“C”请尝试以下操作: defmodule My do def mapdna(dna) when is_binary(dna) do %{"G" => "C","C" => "G","T" => "A", "A" => "U"}[dna] end end #IO.puts My.mapdna(:G) IO.puts My.mapdna("G") 在elixir中,要测试参数是否是字符串,您使用的是\

当我将“G”传递给mapdna时,它应该返回“C”

请尝试以下操作:

defmodule My do

  def mapdna(dna) 
  when is_binary(dna) do
    %{"G" => "C","C" => "G","T" => "A", "A" => "U"}[dna]
  end

end

#IO.puts My.mapdna(:G)
IO.puts My.mapdna("G")
在elixir中,要测试参数是否是字符串,您使用的
是\u binary/1

运行代码:

$ elixir my.exs
C
但是,如果我取消注释注释行:

$ elixir my.exs
** (FunctionClauseError) no function clause matching in My.mapdna/1    

    The following arguments were given to My.mapdna/1:

        # 1
        :G

    my.exs:3: My.mapdna/1
    my.exs:12: (file)
    (elixir) lib/code.ex:677: Code.require_file/2
评论回复:

请看下面的代码:

defmodule RNATranscription do 

  @rna_for  %{"G" => "C","C" => "G","T" => "A", "A" => "U"} 

  def to_rna(dna) do  
    String.codepoints(dna)
    |> Enum.map( &(@rna_for[&1]) )
    |> :erlang.list_to_binary
  end 
end
在iex中:

~/elixir_programs$ iex my.ex
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> RNATranscription.to_rna "ACGT" 
"UGCA"

iex(2)> 
上面的解决方案对于非常长的DNA字符串不会非常有效(它将字符串拆分为一个列表,然后遍历结果列表转换值,然后再次遍历列表以将所有内容连接在一起)。对于长的DNA字符串,您可以使用
二进制模式匹配
获取DNA字符串中的每个字母,并在执行过程中构建RNA字符串。根据,以下解决方案应该是构建RNA字符串的高度优化的方法——即使您正在添加到RNA字符串的“尾部”:

defmodule RNATranscription do 

  @rna_for  %{"G" => "C","C" => "G","T" => "A", "A" => "U"} 

  def to_rna(dna) do  
    _to_rna(dna, <<>>)  #The second arg will hold the rna string as it's being built
  end 

  defp _to_rna(<<dna_letter::utf8, rest::binary>>, rna_string) do
    rna_letter = @rna_for[<<dna_letter::utf8>>] 
    _to_rna(rest, <<rna_string::binary, rna_letter::binary>>)
  end
  defp _to_rna(<<>>, rna), do: rna 

end
因为
::binary
类型有一个默认大小,即“您尝试匹配的二进制文件的其余部分”(尽管您可以显式指定大小)。因此,没有大小的二进制文件只能在模式中出现一次,并且必须位于模式的末尾。(另一方面,
::utf8
的默认大小是组成一个utf8码点的所有字节,最大为4个字节)

现在,由于您的DNA字母都是ascii字母,即始终为1字节长,因此您还可以使用以下模式匹配DNA字符串:

<dna_letter::binary-size(1), rest::binary>>
我想知道这句话:

_to_rna(rest, <<acc::binary, rna::binary>>)
\u to\u rna(rest,)
相当于:

_to_rna(rest, acc <> rna)
\u到\u rna(rest,acc rna)
???如果是,代码可以使用更多的长生不老药习惯用法:

defmodule RNATranscription do 

  @rna_for  %{"G" => "C","C" => "G","T" => "A", "A" => "U"} 

  def to_rna(dna) do  
    _to_rna(dna, "")  #The second arg will hold the rna string as it's being built
  end 

  defp _to_rna(<<dna_letter::binary-size(1)>> <> rest, rna_string) do
    rna_letter = @rna_for[dna_letter]
    _to_rna(rest, rna_string <> rna_letter)
  end
  defp _to_rna("", rna_string), do: rna_string

end
defmodule
@rna_代表%{“G”=>“C”、“C”=>“G”、“T”=>“A”、“A”=>“U”}
def to_rna(dna)do
_对于_rna(dna,“”)35;第二个arg将在构建过程中保存rna字符串
结束
defp_to_rna(rest,rna_string)do
rna_字母=@rna_代表[dna_字母]
_to_rna(剩余,rna_字符串rna_字母)
结束
defp_to_rna(“,rna_字符串),do:rna_字符串
结束
确定找到了答案


dnarna=%{G=>C,C=>G,T=>A,A=>U}

不起作用?
dnarna=%{G=>C,C,C=>G,T=>A,A=>U}%{A=>U,C=>G,G=>C,T=>A}iex(2)>dnarna[/code>它返回C要将'UGCA'定义模块RNADO def输出到_rna(dna)do dnarna=%{'G'=>'C','C'=>'G','T'=>'A','A'=>'U'}Enum.map(dna,&(dnarna[&1])结束end@DavidKurtz,不要在注释中编写代码。改为写:“查看对我的问题的编辑”,然后编辑您的问题并添加您希望我查看的任何代码。@DavidKurtz,请在我的回答中查看我对您评论的回应。
_to_rna(rest, acc <> rna)
defmodule RNATranscription do 

  @rna_for  %{"G" => "C","C" => "G","T" => "A", "A" => "U"} 

  def to_rna(dna) do  
    _to_rna(dna, "")  #The second arg will hold the rna string as it's being built
  end 

  defp _to_rna(<<dna_letter::binary-size(1)>> <> rest, rna_string) do
    rna_letter = @rna_for[dna_letter]
    _to_rna(rest, rna_string <> rna_letter)
  end
  defp _to_rna("", rna_string), do: rna_string

end