首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure -简单映射函数返回nils列表

clojure -简单映射函数返回nils列表
EN

Stack Overflow用户
提问于 2014-10-14 14:55:29
回答 1查看 157关注 0票数 0

此函数接受文件列表,并返回艺术家列表:

代码语言:javascript
复制
(defn get-artists [files]
    (map #(.get-artist (->Mp3 %)) files))

下面是代码的其余部分:

代码语言:javascript
复制
(ns musicdb.filesystem
    (:use [green-tags.core]))

(import '(java.io.File) '(java.net.url) '(java.io))
(require '[clojure.string :as str])

(defn get-files [search-path]
  (let [directory (clojure.java.io/file search-path)
        files (file-seq directory)
        fonly (filter #(.isFile %) files)]
   (map #(last (str/split (.toString %) #"/")) fonly)))

(defprotocol MusicFile
    (get-artist [this])
    (get-song [this])
    (get-album [this]))


(defrecord Mp3 [filename]
    MusicFile
    (get-artist [this]
        (:artist (get-all-info filename)))
    (get-song [this]
        (:title (get-all-info filename)))
    (get-album [this]
        (:album (get-all-info filename))))

下面是我的测试:

代码语言:javascript
复制
(ns musicdb.core-test
  (:require [clojure.test :refer :all]
            [musicdb.core :refer :all]
            [musicdb.filesystem :refer :all]
            [clojure.pprint :refer :all]
            ))

(deftest test_0
  (testing "getFiles returns valid result"
    (is (> (count (get-files "/home/ls/books/books")) 50))))

(deftest test_1
  (testing "check for file included"
    (is (some #{"02 Backlit.mp3"} (get-files "/home/ls/Musik")))))

(deftest test_2
    (testing "creating music file record"
        (let [myfile (->Mp3 "/home/ls/Musik/Panopticon/02 Backlit.mp3")]
            (is (= "Isis" (.get-artist myfile)))
            (is (= "Backlit" (.get-song myfile))))))
(deftest test_3
    (testing "testing get-artists"
    (let [artists (get-artists (get-files "/home/ls/Musik"))
        ]
        (is (> (count artists) 10)))))

(deftest test_4
    (testing "testing get-artists check for artist"
        (let [artists (get-artists (get-files "/home/ls/Musik"))
            ]
            (is (some #{"Isis"} artists))))) ;artists is [nil nil nil ...]

在这个测试中,只有最后一个失败,它返回一个nils列表。

如果您想要复制它们,请确保在您的leiningen project.clj中包含绿色标记依赖项:

代码语言:javascript
复制
[green-tags "0.3.0-alpha"]  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 12:06:57

您的get-files函数不返回文件的完整路径,因此get-all-info只返回零(tags/core.clj#L59tags/core.clj#L120组合)。

下面是一个有效的简单示例:

代码语言:javascript
复制
(map (comp :artist get-all-info)
     (filter #(.isFile %)
             (file-seq (java.io.File. "/home/vema/Downloads/mp3"))))
;=> ("Yo Yo Honey Singh (DJJOhAL.Com)")

(幽默?)免责声明: MP3不应该作为我音乐品味的一个例子,它只是我在网上找到的第一个免费的MP3。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26363940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档