Elm 有调试功能,可以将对象打印到控制台吗?

问题描述 投票:0回答:4

我希望能够检查运行时 javascript 对象。我可以将对象而不是字符串打印到控制台吗?

elm
4个回答
23
投票

您可以使用

Debug.log
,例如:

import Html exposing (text)

f x = x * x

main =
  let
    dummy = Debug.log "dump tuple" (33, 55, f)
  in text "Hello, World!"

8
投票

不幸的是,没有。当您使用

Debug.log
时,所有对象在发送到控制台之前都会转换为字符串。

但是,您可以创建一个使用本机层输出实际对象的函数,但是,这是一个未记录的 API,建议仅将其用作最后的手段。


7
投票

我在编码器上工作时需要更丰富的日志记录,所以我最终为其编写了一个

port
。这是一个关于 Ellie 的工作示例,代码如下:

主.elm

port module Main exposing (main)

import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
import Json.Encode as E exposing (Value, int, object, string)


type alias Model =
    { count : Int
    , name : String
    }


initialModel : Model
initialModel =
    { count = 0
    , name = "Foo"
    }


encodeModel : Model -> Value
encodeModel model =
    object
        [ ( "count", int model.count )
        , ( "name", string model.name )
        ]


port jsonConsole : Value -> Cmd msg


type Msg
    = ConsoleLogJson


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        ConsoleLogJson ->
            let
                json =
                    encodeModel model
            in
            ( model, jsonConsole json )


view : Model -> Html Msg
view model =
    div [] [ button [ onClick ConsoleLogJson ] [ text "Log to console" ] ]


subscriptions : Model -> Sub Msg
subscriptions _ =
  Sub.batch []


init : () -> ( Model, Cmd msg )
init flags =
    ( initialModel, Cmd.none )


main : Program () Model Msg
main =
    Browser.element
        { init = init
        , subscriptions = subscriptions
        , view = view
        , update = update
        }

index.html

<html>
<head>
  <style>
    /* you can style your program here */
  </style>
</head>
<body>
  <main></main>
  <script>
    var app = Elm.Main.init({ node: document.querySelector('main') })
    app.ports.jsonConsole.subscribe(function(json) {
      console.log(json)
    })
  </script>
</body>
</html>

我确信可以做出改进,我很乐意听到它们!


0
投票
let
  _= Debug.log "string1" "string2"
in

您可以用变量而不是字符串替换任何一个“字符串”,只需删除引号即可。两者或仅一个。 您还可以用元组(“string1”,“s”)替换任何一个“字符串”,它看起来像这样。

let
  _= Debug.log ("string1", "string2") "string3"
in

所以函数看起来像这样...

adr : Float -> Float -> Float
adr revenue rooms =
    let
        _= Debug.log rooms revenue
    in
    if rooms /= 0 then
        revenue / rooms

    else
        0

这将安慰 12,$100.00

adr : Float -> Float -> Float
adr revenue rooms =
    let
        _= Debug.log "Rooms" rooms
    in
    if rooms /= 0 then
        revenue / rooms

    else
        0

这会让 12 号房间感到安慰

© www.soinside.com 2019 - 2024. All rights reserved.