Skip to content
Permalink
Browse files

patch 8.1.1835: cannot use printf() as a method

Problem:    Cannot use printf() as a method.
Solution:   Pass the base as the second argument to printf().
  • Loading branch information...
brammool committed Aug 9, 2019
1 parent 22a0c0c commit fd8ca21b3ff207e44891aef922935d4adcd140cf
Showing with 17 additions and 9 deletions.
  1. +5 −1 runtime/doc/eval.txt
  2. +1 −1 src/evalfunc.c
  3. +9 −7 src/testdir/test_method.vim
  4. +2 −0 src/version.c
@@ -6739,7 +6739,11 @@ printf({fmt}, {expr1} ...) *printf()*
< May result in:
" 99: E42 asdfasdfasdfasdfasdfasdfasdfas" ~

Often used items are:
When used as a |method| the base is passed as the second
argument: >
Compute()->printf("result: %d")

< Often used items are:
%s string
%6S string right-aligned in 6 display cells
%6s string right-aligned in 6 bytes
@@ -733,7 +733,7 @@ static funcentry_T global_functions[] =
{"pow", 2, 2, 0, f_pow},
#endif
{"prevnonblank", 1, 1, 0, f_prevnonblank},
{"printf", 1, 19, 0, f_printf},
{"printf", 1, 19, FEARG_2, f_printf},
#ifdef FEAT_JOB_CHANNEL
{"prompt_setcallback", 2, 2, 0, f_prompt_setcallback},
{"prompt_setinterrupt", 2, 2, 0, f_prompt_setinterrupt},
@@ -67,13 +67,15 @@ func Test_dict_method()
endfunc

func Test_string_method()
call assert_equal(['1', '2', '3'], '1 2 3'->split())
call assert_equal([1, 2, 3], '1 2 3'->split()->map({i, v -> str2nr(v)}))
call assert_equal([65, 66, 67], 'ABC'->str2list())
call assert_equal(3, 'ABC'->strlen())
call assert_equal('a^Mb^[c', "a\rb\ec"->strtrans())
call assert_equal(4, "aあb"->strwidth())
call assert_equal('axc', 'abc'->substitute('b', 'x', ''))
eval '1 2 3'->split()->assert_equal(['1', '2', '3'])
eval '1 2 3'->split()->map({i, v -> str2nr(v)})->assert_equal([1, 2, 3])
eval 'ABC'->str2list()->assert_equal([65, 66, 67])
eval 'ABC'->strlen()->assert_equal(3)
eval "a\rb\ec"->strtrans()->assert_equal('a^Mb^[c')
eval "aあb"->strwidth()->assert_equal(4)
eval 'abc'->substitute('b', 'x', '')->assert_equal('axc')

eval 'abc'->printf('the %s arg')->assert_equal('the abc arg')
endfunc

func Test_method_append()
@@ -769,6 +769,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1835,
/**/
1834,
/**/

2 comments on commit fd8ca21

@andymass

This comment has been minimized.

Copy link

replied Aug 9, 2019

There is a point to be made that the first argument should be passed instead: "result %d"->printf(5). Or maybe that's just by analogy with python's format(). But still, what about "result %d: %d"->printf(5, 6)?

Are there other common functions which get the second argument passed with ->? It also is maybe inconsistent this way.

@brammool

This comment has been minimized.

Copy link
Contributor Author

replied Aug 10, 2019

Please sign in to comment.
You can’t perform that action at this time.