1

Тема: VBS: хитрости/особенности

Сегодня стояла задача сделать маленький быстрый скрипт для GPO, чтобы он был максимально маленького размера. Сокращал всё как только можно и дошло до экспериментов, вот что выяснилось...

ipa="192.168.42.77"
splitter=split(ipa,".")
subnet=splitter(2)

тоже самое можно получить так

ipa="192.168.42.77"
subnet=split(ipa,".")(2)

Мне это показалось интересным

Времени не хватает... :-(

2

Re: VBS: хитрости/особенности

Вот еще так можно

subnet=split("192.168.42.77",".")(2)

3

Re: VBS: хитрости/особенности

Поздравляю ! У каждого Колумба своя Америка )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: VBS: хитрости/особенности

Блин...  ребята, мы вообще мозги ?!?!

Времени не хватает... :-(

5

Re: VBS: хитрости/особенности

Функция, выполняет некоторые действия и возвращает ссылку на саму себя. Результат: несколько вызовов функции подряд превращаются в магию. Практической ценности мало, но красиво.

Function Say (Value)
	WScript.Echo Value
	Set Say = GetRef("Say")
End Function

Say("Hello, World!")("I am Magus")("My name is Merlin")
( 2 * b ) || ! ( 2 * b )

6

Re: VBS: хитрости/особенности

Rumata пишет:

Функция, выполняет некоторые действия и возвращает ссылку на саму себя.

Рекурсия.

Xameleon пишет:

Поздравляю ! У каждого Колумба своя Америка )

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: VBS: хитрости/особенности

Возврат ссылки на себя не есть тоже самое что и вызов функции из нее же самой
Предыдущий код можно преобразовать в серию вызовов функции

Say("Hello, World!")
Say("I am Magus")
Say("My name is Merlin")

Подобный прием встречается в javascript. Так что Америку я не открыл, а всего лишь спонтанно портировал прием из одного языка в другой.

( 2 * b ) || ! ( 2 * b )

8

Re: VBS: хитрости/особенности

Rumata пишет:

Возврат ссылки на себя не есть тоже самое что и вызов функции из нее же самой

Возможно, я не совсем прав, но по сути, по-моему, то же самое.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: VBS: хитрости/особенности

Перенёс тему в профильный раздел.

10 (изменено: Евген, 2011-09-30 20:40:39)

Re: VBS: хитрости/особенности

Rumata пишет:
Say("Hello, World!")("I am Magus")("My name is Merlin")

Мда...  согласен, такого синтаксиса в использовании тоже не видовал...:/
ну фишка-то здесь вот в этом
   

Set Say = GetRef("Say")

Где-то у нас dab000 собирал мегаобфускатор...  дык вот если б он примастерил эти тонкости в свой обфускатор - было б вообще чудно...

Но для начала пускай все выложаться для набора коллекции подобных "ляп" в синтаксисе...

Времени не хватает... :-(

11

Re: VBS: хитрости/особенности

интересный пост, интересные фичи, интересная коллекция получается

Евген пишет:

Где-то у нас dab000 собирал мегаобфускатор...  дык вот если б он примастерил эти тонкости в свой обфускатор - было б вообще чудно...

польстили за мега , "примастерить" эти фичи в обфускаторе можно - регулярные выражения - сила , правда пока не вижу каким образом

Евген пишет:

ну фишка-то здесь вот в этом
   

Set Say = GetRef("Say")

GetRef, наверное, немного из другой оперы - HTA - таким образом, похоже, рекурсию можно организовать, не пробовал

12

Re: VBS: хитрости/особенности

Да что же вы все на рекурсию заглядываетесь. Это цепочка вызовов функций. Все не мог найти правильное определение, вот - Continuation passing style.

( 2 * b ) || ! ( 2 * b )

13

Re: VBS: хитрости/особенности

Я тоже в упор рекурсии не вижу.

14

Re: VBS: хитрости/особенности

Rumata пишет:

Функция, выполняет некоторые действия и возвращает ссылку на саму себя. Результат: несколько вызовов функции подряд превращаются в магию. Практической ценности мало, но красиво.

Function Say (Value)
    WScript.Echo Value
    Set Say = GetRef("Say")
End Function
 
Say("Hello, World!")("I am Magus")("My name is Merlin")

Супер!
Это определённо что-то новенькое! И никак не рекурсия.
Getref в данном примере говорит только о том что идёт возварат ссылки, о чем уже и сказал Rumata.
Всё же не понятно - как оно происходит
Недокументированная особенность языка? Да нет...
'________________________________________________________
Спустя некоторое время:
А, до меня дошла суть! Никаких чудес. Ну ведь это же элементарно:

Интерпретируем строку в уме (слева направо):

Say("Hello, World!")("I am Magus")("My name is Merlin")

функция выполняет некое действие и на то самое место, где стоит вызов функции с параметром возвращается ссылка на туже самую функцию.
Получается уже:

Say("I am Magus")("My name is Merlin")

И затем снова вместо вызова функции с параметром получаем вызов функции, параметром для которой будет уже следующее выражение в скобках :

Say("My name is Merlin")

Поэтому то и получается что строка - синтаксически верная.

15

Re: VBS: хитрости/особенности

Рекурсии, и правда, никакой, да и практической ценности, действительно, мало

16

Re: VBS: хитрости/особенности

Я уже говорил, что этот прием используется в javascript. Не часто, но используется. Там эта особенность бывает востребована. Например, в jQuery работают по этому принципу - возврат объекта, что позволяет создавать цепочки вызовов методов объекта. Или создание и одновременно многократный вызов безымянной функции, чтобы не плодить сущности. В VBS это не возможно, поэтому и нет в нем ценности. Или я ошибаюсь и не знаю, что в VBS есть возможность возвращать ссылку на текущий объект?

( 2 * b ) || ! ( 2 * b )

17

Re: VBS: хитрости/особенности

Rumata, думаю, не ошибаетесь, ибо вроде как нет там такого понятия, как «текущий объект».

Вкратце изложенное проще описать, уйдя от кажущейся рекурсии, так: вызов процедуры/функции можно производить при помощи GetRef("<Имя процедуры/функции>"):

Option Explicit

Call GetRef("Proc") (GetRef("FuncAdd")(2), GetRef("FuncAdd")(3))

WScript.Quit 0

Sub Proc(Value1, Value2)
    WScript.Echo "Proc:", Value1, Value2
End Sub

Function FuncAdd(Value)
    WScript.Echo "Func:", Value
    
    FuncAdd = Value + 1
End Function
FuncAdd: 2
FuncAdd: 3
Proc: 3 4

18 (изменено: dab00, 2011-10-02 12:09:22)

Re: VBS: хитрости/особенности

В VBS я применяю GetRef для привязки процедур к событиям объектов HTML, не было пока необходимости в ином применении (пытаюсь оправдать показанное выше невежество )

19

Re: VBS: хитрости/особенности

2 alexii:

alexii пишет:

Rumata, думаю, не ошибаетесь, ибо вроде как нет там такого понятия, как «текущий объект».

Ммм... А использование "Me" в процедурах разве не считается за некий аналог ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

20

Re: VBS: хитрости/особенности

То в VB/VBA.

21

Re: VBS: хитрости/особенности

Я проверил - в VBS тоже есть. А вот то что это не документировано - это плохо. Имею в виду scripts56.chm (версию и время скачивания файла не помню, но одна из последних). Ключевое слово Me упоминается в нескольких статьях этой документации, но нет отдельной статьи, описывающей это ключевое слово.

( 2 * b ) || ! ( 2 * b )

22

Re: VBS: хитрости/особенности

Ага. Нашёл. Если я правильно понял, то в VBScript «Me» представляет собой объект типа «VBScriptTypeInfo»:

WScript.Echo TypeName(Me)

ссылающийся на сам скрипт?

А в JScipt «this» — это ссылка не на скрипт, а на функцию, так?

23

Re: VBS: хитрости/особенности

2 alexii: На сколько я знаю - в VBScript "Me" в глобальном виде это действительно ссылка на объект скрипта и в процедурах так же. Но в случае подключеных событий это ссылка на объект породивший событие.

К примеру:


Option Explicit

MsgBox "Глобальная ссылка на Me:" & TypeName(Me)

Test

Sub Test()
	MsgBox "Ссылка на Me внутри обычной процедуры:" & TypeName(Me)
End Sub

Dim sc

set sc = WScript.CreateObject("MSScriptControl.ScriptControl.1","sc_")
sc.Language = "vbscript"
sc.AddCode "Dim a as long"

Sub sc_error()
	MsgBox "Ссылка на Me внутри события:" & TypeName(me)
End Sub
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

24 (изменено: Rumata, 2011-10-03 11:13:24)

Re: VBS: хитрости/особенности

alexii пишет:

ссылающийся на сам скрипт?


Sub Proc()
	WScript.Echo "Self.Proc()"
End Sub

Set Self = Me
Self.Proc

Me.Proc
alexii пишет:

А в JScipt «this» — это ссылка не на скрипт, а на функцию, так?

Точнее будет так. this это ссылка на объект, который является текущим контекстом вызова. В контексте всего скрипта this указывает на глобальный объект.

( 2 * b ) || ! ( 2 * b )

25

Re: VBS: хитрости/особенности

Спасибо, ясно. И вроде бы, внутри определения класса «Me» ссылается на класс, так?