Ruby 有没有更简洁的方法来放置这些散列/数组?

Ruby 有没有更简洁的方法来放置这些散列/数组?,ruby,arrays,hash,Ruby,Arrays,Hash,我有一个长脚本中的方法,可以根据基因序列创建散列,但是它确实很混乱,因此我想知道是否有一种方法可以更优雅地表达它 下面是脚本的一个示例(即,它包含一个示例) def make_hash(motif) main_hash=hash.new id=“>ISOTIG0009_f2_3~:S.P.解理位点:22:23-S.P.D-值:0.532” seq=“MLKCFSIIMGLILLEGGGCA~IYFYRAQAQQKSLTDVTITTDYRENADFQDLADALQSGLSCCGVNSSYWDNNI

我有一个长脚本中的方法,可以根据基因序列创建散列,但是它确实很混乱,因此我想知道是否有一种方法可以更优雅地表达它

下面是脚本的一个示例(即,它包含一个示例)

def make_hash(motif)
main_hash=hash.new
id=“>ISOTIG0009_f2_3~:S.P.解理位点:22:23-S.P.D-值:0.532”
seq=“MLKCFSIIMGLILLEGGGCA~IYFYRAQAQQKSLTDVTITTDYRENADFQDLADALQSGLSCCGVNSSYWDNNIYNCSGPANNPEALWCAFLLYTGSKRSSQHPVRLWSFPRTKYFPHKDLHWLCGYVYNVD”
id\u hash=hash[[:id\u start,:id\u end],id.split(“~”).map(&:strip)].transpose]
seq_hash=hash[[:signalp,:seq_end],seq.split(“~”).map(&:strip)].transpose]
signalp=顺序散列[:signalp]
new_seq_end=seq_hash[:seq_end].gsub(/#{motif}/,'\0')
new_seq_hash=hash[:signalp=>signalp,:new_seq_end=>new_seq_end]
main_hash[id_hash]=[new_seq_hash]
返回主散列
结束
motif=“VT | QAQ | F.D”
main\u hash=make\u hash(motif)
main_hash.each do|id_hash,seq_hash|
放置id\u哈希[:id\u start]
放置id\u哈希[:id\u end]
放置顺序散列[0][:signalp]
放置顺序散列[0][:新建顺序结束]
结束
那么,有没有更优雅的方法来编写make_散列方法


非常感谢

我还没有测试过这一点,但我认为这种简化会奏效:

def make_hash(motif)
  id = ">isotig00009_f2_3 ~: S.P. Cleavage Site: 22:23 - S.P. D-value: 0.532"
  seq = "MLKCFSIIMGLILLLEIGGGCA~IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

  id_hash = Hash[[[:id_start, :id_end], id.split("~").map(&:strip)].transpose]

  f, s = seq.split("~").map(&:strip)
  s.gsub!(/#{motif}/, '<span class="motif">\0</span>')

  new_seq_hash = Hash[Hash[:signalp, f], Hash[:new_seq_end, s]]

  Hash[id_hash, new_seq_hash]
end
如果需要使
seq2
更具可读性,我们可以使用“行继续”字符
\
(甚至可以在字符串中工作),如下所示:

  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC"\
         "SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"
或者这个:

  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC\
SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"

如果您愿意,您可以创建'id'和'seq'常量('id'和'seq',比方说),并将它们移到方法定义之外。毫不奇怪,行继续符也适用于常量字符串。

我们需要知道它实际上在做什么。这个问题更适合于一个问题,在第一个代码示例中,在执行gsub方法时,您有转义符号(“\”)。这背后有什么原因吗?伊斯梅尔,只要``是一行中的最后一个字符,它就意味着这行继续下一行。我把它放进去是为了让它更具可读性,但我对位置的选择很差。我稍微整理了一下代码,现在不需要行继续。我还借此机会讨论了在字符串中使用换行符。
  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC"\
         "SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"
  seq2 = "IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNC\
SGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD"